Java クローン作成の簡単な分析 (コード例)

不言
リリース: 2019-03-12 15:36:41
転載
2533 人が閲覧しました

この記事では、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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート