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接口,是否真的有必要? 在我看来,如果我想要在衍生参考变量的情况下进行深层复制,这可能是一个好方法。 谢谢。
您的代码不会进行深度复制,甚至不会进行浅度复制('str'不同)。你真的想要一个深刻的副本吗?另外,你的朋友是对的。你有什么叫做_copy constructor_。这是一种非常好的编码风格。另外,除非实现'hashcode()',否则您应该期望不同的对象具有不同的哈希码。 –
我的代码完美地制作了一个深层副本。所有字段的值都相同。是的,这是一个执行深层复制的复制构造函数。“显然,我没有重写hashcode(),所以我不会得到相同的哈希代码。但为什么它不是在你的意见深层复制? –
首先,您在我发布我的评论后更改了代码,因此我的评论部分现在无关紧要。它确实做了一个_shallow_副本。但是,如果您想要深度复制,则需要执行'this.str = new String(a.str)'。由于String是不可变的,所以这不是什么大问题,但它也不是一个深层次的拷贝。 –