次のコードの理由
ディープコピーは実現可能でしょうか?
ringa_lee
これは表面的には「ディープコピー」に見えるだけです 実際には、学生も教授もディープコピーを実装していません。
リーリー
"==" であることがわかります。p.name が設定されていない場合、それらの名前も "==" であるため、ディープコピーは実装されません。 s2.p.name を設定すると、s2.p.name は別の文字列定数のアドレスを指すため、 (s1.p.name == s2.p.name) //false
これは基本的なデータ型のみをコピーできる浅いコピーです。オブジェクトのメンバー変数をコピーするには、メンバー変数の clone メソッドを呼び出す必要があります。これが、複数の浅いコピーで深いコピーを実現できることを私は理解しています。
これはディープコピーではなく、クローンを作成することができます。これは、文字列がまだ元のものを参照していることを意味します。
jdk clone メソッドのデフォルトの実装は値のコピーです。基本的な型の場合、値のコピーが使用されます。参照の場合、コピー参照が指すアドレスです。
このコードがない場合、o.p=(Professor)p.clone();元のオブジェクトの p とクローン オブジェクトは同じ Professor オブジェクトを参照します。これは浅いコピーです。
o.p=(Professor)p.clone();
これは表面的には「ディープコピー」に見えるだけです 実際には、学生も教授もディープコピーを実装していません。
main メソッドにいくつかの出力を追加します。リーリー
s1 と s2 の名前は依然として"==" であることがわかります。p.name が設定されていない場合、それらの名前も "==" であるため、ディープコピーは実装されません。 s2.p.name を設定すると、s2.p.name は別の文字列定数のアドレスを指すため、 (s1.p.name == s2.p.name) //false
これは基本的なデータ型のみをコピーできる浅いコピーです。オブジェクトのメンバー変数をコピーするには、メンバー変数の clone メソッドを呼び出す必要があります。これが、複数の浅いコピーで深いコピーを実現できることを私は理解しています。
これはディープコピーではなく、クローンを作成することができます。これは、文字列がまだ元のものを参照していることを意味します。
jdk clone メソッドのデフォルトの実装は値のコピーです。基本的な型の場合、値のコピーが使用されます。参照の場合、コピー参照が指すアドレスです。
このコードがない場合、
o.p=(Professor)p.clone();
元のオブジェクトの p とクローン オブジェクトは同じ Professor オブジェクトを参照します。これは浅いコピーです。