今日、ディープ コピーに関するこの投稿を読んで、いくつか質問がありました。
最初のコードで、作成者は、(整数) オブジェクトをクローンに追加することは、元のコードには表示されないと述べています。これはなぜですか?私が理解しているように、クローン作成は基本的に、元のオブジェクトと同じオブジェクトへの参照を持つオブジェクトを作成します。
クローンの変更がオリジナルに反映されないのはなぜですか?
クローンはオリジナルと同じ参照を共有していませんか?
クローンの全体的な目的は、オリジナルとは異なるものにすることです。そのため、クローンの変更はオリジナルには反映されません。それ以外の場合は、クローンではなく単純な代入を使用できます。
例えば
MyClass a = new MyClass(); // some cloneable class
MyClass b = a; // not a clone, changes to `b` will affect in `a`
// assignment duplicates the reference
-or-
MyClass b = a.clone(); // clone, changes to `b` will not affect in `a`
// clone duplicates the object
Java のクローン作成に関するウィキペディアの記事が実際にここにあります。
のクローンをObject 'A'
作成すると、新しいObject 'B'
(オブジェクトへの参照が同じ)が、異なるメモリアドレスに作成されます。したがって、オブジェクト'A'を変更すると、の同じメモリアドレスにアクセスしなくなりますObject 'B'
。したがって、クローンでの変更は元のオブジェクトに反映されず、その逆も同様です。
浅いコピー
通常、オブジェクトのcloneメソッドは、同じクラスの新しいインスタンスを作成し、すべてのフィールドを新しいインスタンスにコピーして返します。これは浅いコピーに他なりません。オブジェクトクラスはクローンメソッドを提供し、シャローコピーのサポートを提供します。タイプとして「Object」が返されるため、元のオブジェクトに明示的にキャストバックする必要があります。
ディープコピー
ディープコピーが必要な場合は、自分で実装する必要があります。コピーされたオブジェクトに他のオブジェクトが含まれている場合、その参照はディープコピーに再帰的にコピーされます。ディープコピーを実装するときは、循環依存に陥る可能性があるので注意してください。自分でディープコピーを実装したくない場合は、シリアル化を行うことができます。循環依存関係を暗黙的かつ適切に処理するディープコピーを実装します。
(情報源)
ここに実例があります:
浅い
深い:
(出典:wikimedia.org)