1。浅いコピーとディープコピーの概念
shallowコピー(浅いクローニング)
コピーされたオブジェクトのすべての変数には、元のオブジェクトと同じ値が含まれていますが、他のオブジェクトへのすべての参照はまだ元のオブジェクトを指しています。言い換えれば、浅いコピーは、それが参照するオブジェクトではなく、考慮されているオブジェクトを単にコピーするだけです。
deepコピー(ディープクローニング)
コピーされたオブジェクトのすべての変数には、他のオブジェクトを参照する変数を除き、元のオブジェクトと同じ値が含まれています。他のオブジェクトを参照する変数は、元の参照オブジェクトではなく、コピーされた新しいオブジェクトを指します。言い換えれば、ディープコピーは、コピーされるオブジェクトによって参照されるすべてのオブジェクトをコピーします。
2。 Javaのclone()メソッド
cloneクローンメソッドはオブジェクトのコピーをコピーし、発信者に返します。一般的に言えば、clone()メソッドは次のことを満たします。
and任意のオブジェクトxの場合、x.clone()!= x //クローンされたオブジェクトは、任意のオブジェクトxに元のオブジェクトと同じオブジェクトではありませんx.clone()。 。
Javaのオブジェクトのクローン
objectオブジェクトのコピーを取得するために、オブジェクトクラスのclone()メソッドを使用できます。
derivedクラスの基本クラスのclone()メソッドを上書きし、それを公開していると宣言します。
derivedクラスのclone()メソッドでは、super.clone()を呼び出します。
派生クラスにクローン可能なインターフェイスを実装します。
次のコードをご覧ください。
パブリッククラスはcloneable {string name、int age) Student)super.clone(); // clone()オブジェクトのClone()は、コピーするオブジェクトを認識します。 } catch(clonenotsuptedexception {system.out.println(e.tostring()); S2 =(学生)s2.name = "lisi"; System.out.println( "name ="+s1.name+"、"+"age ="+s1.age); +s2.age);説明:
derivedクラスでオブジェクトのclone()メソッドを上書きするときに、super.clone()を呼び出す必要があるのはなぜですか?実行時に、オブジェクトのclone()は、コピーするオブジェクトを認識し、このオブジェクトにスペースを割り当て、オブジェクトをコピーして、元のオブジェクトの内容を1つずつ新しいオブジェクトのストレージスペースにコピーします。
java.lang.Objectクラスから継承されたクローン()メソッドは浅いコピーです。次のコードはそれを証明できます。
クラス教授{文字列名、int age){name = age = age; int age教授P; //学生1と学生2の参照値は同じです。学生(int age、教授){this.age = age.p = p; .Clone(); ){Professor P = new教授(「Wangwu」、50); "; s2.p.age = 30; system.out.println(" name = "+s1.p.name+"、 "+" age = "+s1.p.age); system.out.println(" name = "+s2.p.name+"、 "+" age = "+s2.p.age); //学生1と2の教授の出力結果はlisiになり、年齢は30です。 }}では、深いクローニング、つまりS2を変更する教授は、S1教授に影響を与えない方法をどのように実装すべきでしょうか?コードは次のように改善されます。
学生1の教授を変更せずにするための改善(深いクローン)
クラスはクローン可能な{文字列名、int age) clone(); int age、p){this.name = age.p = p; } catch(cloneNotsuptedexception {system.out.println(e.toString)//参照オブジェクトもコピーします。 args){新しい教授( "wangwu"、50); 「lisi」; S2.p.30; System.out.println( "name ="+s1.p.name+"、"+"age ="+s1.p.age); "+" age = "+s2.p.age);}} 3。シリアル化を使用してディープコピーを実行します(主に、より複雑なオブジェクトの深いコピーのClone()方法の書き換えを避け、ブレークポイントの連続伝送やその他の機能を実装することもできます)
ストリームにオブジェクトを書き込むプロセスは、シリアル化プロセスですが、Javaプログラマーのサークルからの「フローズン」または「ピッキング」プロセスと呼ばれ、結果として生じる並列化プロセスは「解凍」または「沈着」と呼ばれます。プロセス。
ストリームに記載されているものはオブジェクトのコピーであり、元のオブジェクトがJVMにまだ存在するため、「ピクルスにピクルス」のものはオブジェクトのコピーにすぎず、Javaピクルスはまだできることを指摘する必要があります。新鮮になります。
Java言語でオブジェクトを深くコピーすると、オブジェクトが最初にシリアル化可能なインターフェイスを実装してから、オブジェクト(実際にはオブジェクトのコピーだけ)をストリーム(ピクルスに漬けます)に書き込み、ストリームから読み取ります(置くことができます(置く)ことがあります(実際にはオブジェクトのコピー)ピクルスが戻って)オブジェクトを再構築できます。
以下は、ディープコピーソースコードです。
パブリックオブジェクトdeepclone {// bytearrayoututstreamにオブジェクトを書き込みます。 bo.tobytearray());これを行う前提は、オブジェクトとオブジェクト内のすべての参照オブジェクトがシリアル化可能であることです。 。 外。上記の例コードは次のように改善されます。
クラス教師は、serializable {int age;年齢; //学生1と生徒2の参照値は同じです。 public void Student(int age、teacher t){this.name = age.p = p; bytearrayoutoutstreamに移動しますbytearrayoutputstream(); new objectinputStream(bi); 18、T) name = "+s1.t.name+"、 "+" age = "+s1.t.age);}}