1

私は非常に長い間これで立ち往生しています。

次のコードがクローンを作成するかどうか教えてください。

class A
{  
 int i;
    int j;  
    String str;  
    A()  
    {  
      i=10;  
      j=30;  
      str="Hello";  
    }  
    A(A a)  
   {  
      this.i=a.i;  
      this.j=a.j;  
      this.str=a.str;  
   }  
}  
class B
{  
   public static void main(String args[])  
   {
      A a  = new A();  
      A a1 = new A(a);
      /* I want to make clone like this. */  
      } 
}

このコードを実行するときと、aとa1のハッシュコードを出力するときは、それらは異なります。しかし、私の友人の何人かは、これはクローンを作る正しい方法ではないと言います。Cloneableインターフェースを実装する必要がありますが、それは本当に必要ですか?私の意見では、派生参照変数の場合でもディープコピーを作成したい場合は、良いアプローチになる可能性があります。ありがとうございました。

4

1 に答える 1

2

オブジェクトのクローンを作成するには、Clonableインターフェイスを実装する必要があります。実装したものは、コピーコンストラクターと呼ばれます。Clonableを実装するよりも、コピーコンストラクターの方が適しています。

コピーされたオブジェクトのハッシュコード/等しいがコピー元のオブジェクトと異なる理由は、Aクラスのハッシュコードまたは等しい関数をオーバーライドしていないため、等しいだけでなくIDをチェックしているためです(まったく同じオブジェクトであり、同じ値のオブジェクト)。hashcode / equalsをオーバーライドすることで、代わりにクラスにそのプロパティの値を比較させることができます。

于 2012-05-24T00:37:16.193 に答える