私が理解したように、メソッドclone()
は、Javaでオブジェクト(参照なし)をコピーする機能を提供します。しかし、私はコピーが浅いことも読んでいます。だから何のポイント?どのような能力が私に与えられるのでしょうか、簡単な訴えはありませんか?Javaのclone()メソッド
答えて
違いは、元のオブジェクトを変更せずにクローンオブジェクトを変更できることです。 p2
上の変更はないながら
Point p = new Point(1,2);
Point p2 = p.clone();
Point p3 = p;
p2.x = 5;
p3.y = 7;
p3
上の変更は、p
にフィードバックありません。
Point p = new Point(1,2);
.-----. .-----.
p -----> | x -+--> | 1 |
| | '-----'
| | .-----.
| y -+--> | 2 |
'-----' '-----'
Point p2 = p.clone();
.-----. .-----. .-----.
p -----> | x -+--> | 1 | <--+- x | <----- p2
| | '-----' | |
| | .-----. | |
| y -+--> | 2 | <--+- y |
'-----' '-----' '-----'
Point p3 = p;
.-----. .-----. .-----.
p -----> | x -+--> | 1 | <--+- x | <----- p2
| | '-----' | |
| | .-----. | |
p3 -----> | y -+--> | 2 | <--+- y |
'-----' '-----' '-----'
p2.x = 5;
.-----. .-----. .-----. .-----.
p -----> | x -+--> | 1 | | x -+--> | 5 |
| | '-----' | | '-----'
| | .-----. | |
p3 -----> | y -+--> | 2 | <--+- y | <----- p2
'-----' '-----' '-----'
p3.y = 7;
.-----. .-----. .-----. .-----.
p -----> | x -+--> | 1 | | x -+--> | 5 |
| | '-----' | | '-----'
| | .-----. | |
p3 -----> | y | | 2 | <--+- y | <----- p2
'--+--' '-----' '-----'
| .-----.
'---> | 7 |
'-----'
単純な割り当ては、オブジェクトのエイリアスを作成するだけです。 clone()では、各属性メンバもcloneオブジェクトで初期化されます。ただし、属性メンバー自体にそれ以上のオブジェクトが含まれている場合、それらはコピーされません。
割り当ては、インスタンスの参照を変数にコピーします。 クローン操作は、インスタンスをクローンします(クローンへの参照を割り当てます)。 割り当てで
、あなたは複数オブジェクトの参照を保持複数の変数を持っていますクローニングとオブジェクトを指す複数変数になってしまいます。
SomeCloneable a = new SomeCloneable();
SomeCloneable b = a; // a and b point to the same object
/* versus */
SomeCloneable a = new SomeCloneable();
SomeCloneable b = a.clone(); // a and b point to the different objects
'Cloneable'はいえ、'クローン() 'メソッドを公開しません。 'a'と' b'を 'SomeCloneable'として宣言しなければなりません。 –
@PaŭloEbermann - 良いキャッチ、ありがとう、私はそれを修正します! –
浅いコピーは、オブジェクトのデフォルトです:
はのは、状況が個々のステートメント(1
、2
、5
、7
を仮定すると、オブジェクトになります)の後にあるか見てみましょう。クローンを無効にしてディープコピーを行うことができます。あなたがCloneableを実装して(クローンをオーバーライドする必要が深さにクローニングする
)
public class MyClass implements Cloneable {
private Object attr = new Object();
@Override
public Object clone() throws CloneNotSupportedException {
MyClass clone = (MyClass)super.clone();
clone.attr = new Object();
return clone;
}
@Override
public String toString() {
return super.toString()+", attr=" + attr;
}
public static void main(String[] args) throws Exception {
MyClass x = new MyClass();
System.out.println("X="+x);
MyClass y = (MyClass)x.clone();
System.out.println("Y="+y);
}
}
- 1. のJavaにStackOverflowError cloneメソッド
- 2. jqueryの.clone()メソッドと.remove()メソッド
- 3. clone()メソッドで何ができますか?
- 4. GitLab CI:git cloneの代わりにgit clone
- 5. clone()StringBuilder
- 6. GWTアプリケーションで使用されるJavascript generic clone()メソッド
- 7. jquery clone id update
- 8. git clone localhost?
- 9. jquery clone drag
- 10. Hudson git clone error
- 11. * git svn clone *
- 12. jquery clone draggable click
- 13. Ember.js + jQuery UI Draggable Clone
- 14. Phabricator git cloneエラー403
- 15. IE7 jQueryの.cloneと.serialize
- 16. git-svn clone |偽のブランチ
- 17. System.ObjectにCloneメソッドを入れなかったのはなぜですか?
- 18. JavaのaddPropertyChangeListenerメソッド
- 19. Javaのメソッド
- 20. Aptana 3 Github Clone Repository Fail
- 21. JQuery。Clone()がクリックイベントを失う
- 22. Git Pull and Clone from HostGator
- 23. jquery clone functionネスト削除オプション
- 24. Java、別のメソッドの中のメソッド宣言?
- 25. - JavaのString.equal(String)メソッド
- 26. Javaの静的メソッド
- 27. のJavaでReplaceAll()メソッド
- 28. Javaの汎用メソッド
- 29. Javaの汎用メソッド
- 30. Javaのスタブ・プライベート・メソッド
ありがとう、しかし、私はなぜp2.xがpで何も変えない理由は分かりません。 2つの異なるオブジェクトがありますが、同じxとyを指しています(浅いコピーなので)。私は何が欠けていますか? – Tom
割り当て(最後の2行で)は 'x'と' y'が指しているものを変更します。 'p.x'と' p2.x'が同じ値(同じオブジェクトを参照)を持っていても、それらは異なる変数であり、一方を代入することは他方を変えません。 (この場合はオブジェクトでもプリミティブな値ではありませんが、オブジェクトであれば同じものが有効です) –
この例では、浅いクローンと深いクローンの違いは表示されません。 –