我很长时间以来一直坚持这个。
告诉我以下代码是否进行了克隆?
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接口,这真的有必要吗? 在我看来,如果我想在派生引用变量的情况下进行深度复制,这可能是一个很好的方法。 谢谢。
答案 0 :(得分:2)
您需要实现Clonable接口才能克隆对象。您实现的内容称为复制构造函数。复制构造函数优于实现Clonable。
您复制的对象与其复制的对象具有不同的hashcode / equals的原因是因为您没有覆盖A类中的hashcode或equals函数,因此它检查身份而不仅仅是相等(完全相同的对象,而不是具有相同值的对象)。通过重写hashcode / equals,您可以让您的类比较它的属性值。