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 类中的哈希码或等于函数,因此它正在检查身份而不仅仅是相等(完全相同的对象,不是具有相同值的对象)。通过覆盖 hashcode/equals,您可以让您的类改为比较其属性的值。

于 2012-05-24T00:37:16.193 回答