どのようにJavaのクローン()は本当に浅いコピーを使用していますか?

ジョルジLagidze:

私はそれが既に要求される場合があります知っているが、私の質問は違うものです。私が検索したと私は、Javaメソッドの知っているobject.clone()手段は、参照していない実際のオブジェクトをコピーする用途の浅いコピーを。のは、私は犬のクラスを持っているとしましょう

 Class Dog{
     public Dog(String name, DogTail tail, DogEar ear){
          this.name = name;
          this.tail = tail;
          this.ear  = ear;   
     } 
} 
DogTail t = new DogTail(); 
DogEar ear = new DogEar(); 
Dog dog1 = new Dog("good", t,ear);

のは、私がDOG1のコピーを取得したいとしましょう。

犬dognew = dog1.clone()。

この場合clone()の方法は、簡易コピーを使用して、それが参照をコピーすることを意味します。上記で作成したIチェンジトンオブジェクトまたは耳の方法の場合は、だから、それはdognewオブジェクトまたはその逆でつもりの変化です。このクローニング良いはどうですか?誰かが大きな巨大なオブジェクトを作成すると、使用中にパフォーマンスを保存すると、クローニングよりも悪いことを言ったので、この質問は生まれたclone()方法を。

FunctionR:

デフォルトバージョンのclone()メソッドは、オブジェクトの浅いコピーを作成します。

オブジェクトの浅いコピーは、元のオブジェクトのすべてのフィールドの完全なコピーを持っています。元のオブジェクトをフィールドとして他のオブジェクトへの参照を持っている場合、それらのオブジェクトの参照のみがクローンオブジェクトにコピーされ、それらのオブジェクトのコピーが作成されていません。意味クローンオブジェクトを介してこれらのオブジェクトに加えられた変更は、元のオブジェクトまたはその逆に反映されます。

オブジェクトのディープコピーを作成するには、オーバーライドすることができますclone()方法を。

protected Object clone() throws CloneNotSupportedException
{
    DogTail tail = (DogTail) this.tail.clone();

    Dog dog = (Dog) super.clone();

    dog.tail = tail;

    return dog;
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=213528&siteId=1