この記事では、Java クローン作成の簡単な分析 (コード例) を紹介します。これは一定の参考価値があります。必要な友人は参照してください。お役に立てば幸いです。
深さとは何ですか?ただの学位です。
Clone:
のコピーを作成します。 クローンされたクラスは、Cloneable インターフェイスを実装し、 clone() メソッドをオーバーライドし、親クラスの clone() 呼び出しに戻ります。
public class Person implements Cloneable{ @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } //...省略其余代码 }
次に、クローンを作成するときに、先ほど説明した clone() を呼び出すだけです。
浅いコピー
これで Child クラスができました:
public class Child{ //...省略其余代码 }
また Person クラスもできました:
public class Person implements Cloneable{ private int age; private String name; private Child child; //...省略其余代码 }
Person オブジェクト p1 をクローンして割り当てますtoString() と hashCode() の結果:
public class Main { public static void main(String[] args) throws CloneNotSupportedException { Person p1 = new Person("zhangsan",23); p1.setChild(new Child("xiaoming", 1);); //克隆操作 Person p2 = p1.clone(); //打印看看 System.out.println(p1+", "+p1.hashCode()+", "+p1.getChild().hashCode()); System.out.println(p2+", "+p2.hashCode()+", "+p2.getChild().hashCode()); } }
出力:
Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=1]], 118352462, 1550089733 Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=2]], 865113938, 1550089733
結論: p1、p2 メンバーの値は等しいですが、これらは 2 つの異なるオブジェクトであり、その子メンバーは同じオブジェクトです。
ディープ コピー
Child の Cloneable インターフェイスも実装し、 clone() をオーバーライドします。
public class Child implements Cloneable{ @Override protected Object clone() throws CloneNotSupportedException { return super.clone();; } //...省略其余代码 }
次に、Person## を変更します。 # クラス
clone() の実装:
public class Person implements Cloneable{ @Override protected Object clone() throws CloneNotSupportedException { Person p = (Person)super.clone(); p.setChild((Child)child.clone()); return p; } //...省略其余代码 }次に、上記の
main(String [] args) を呼び出すと、結果は次のようになります:
Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=1]], 118352462, 1550089733 Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=2]], 865113938, 1442407170結論 : p1 と p2 は 2 つの異なるオブジェクトであり、その子メンバーも 2 つの異なるオブジェクトです。 概要クローンとはコピーを作成することです。 浅いコピーは単に値をコピーすることです。参照メンバーが存在する場合、その参照メンバーは同じオブジェクトになります。これは深いコピーの場合には当てはまりません。 なぜ次のように考えることができます。 clone() を呼び出す人はその人のディープコピーです。 上記の浅いコピーの例では、p1 オブジェクトの clone() が呼び出されるため、p1 と p2 は 2 つの異なるオブジェクト (p1 と p2 自体の深いコピー) になります。ディープ コピーの例では、呼び出しだけでなく、 p1 の clone() は呼び出しますが、Child タイプのオブジェクトの clone() も呼び出すため、2 つの Child タイプのオブジェクトは異なります (すべてのオブジェクトのディープ コピー)。
以上がJava クローン作成の簡単な分析 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。