2012-05-24 99 views
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接口,是否真的有必要? 在我看来,如果我想要在衍生参考变量的情况下进行深层复制,这可能是一个好方法。 谢谢。

+1

您的代码不会进行深度复制,甚至不会进行浅度复制('str'不同)。你真的想要一个深刻的副本吗?另外,你的朋友是对的。你有什么叫做_copy constructor_。这是一种非常好的编码风格。另外,除非实现'hashcode()',否则您应该期望不同的对象具有不同的哈希码。 –

+0

我的代码完美地制作了一个深层副本。所有字段的值都相同。是的,这是一个执行深层复制的复制构造函数。“显然,我没有重写hashcode(),所以我不会得到相同的哈希代码。但为什么它不是在你的意见深层复制? –

+0

首先,您在我发布我的评论后更改了代码,因此我的评论部分现在无关紧要。它确实做了一个_shallow_副本。但是,如果您想要深度复制,则需要执行'this.str = new String(a.str)'。由于String是不可变的,所以这不是什么大问题,但它也不是一个深层次的拷贝。 –

回答

2

您需要实现Clonable接口才能克隆对象。你已经实现的是一个拷贝构造函数。复制构造函数比实现Clonable更可取。

你复制的对象与它被复制的对象有不同的hashcode/equals的原因是你没有重写你的A类中的hashcode或equals函数,所以它检查的是标识而不仅仅是相等(精确的相同的对象,而不是具有相同值的对象)。通过重写hashcode/equals,你可以让你的类比较它的属性值。