我的课程Calle
包含String nombre;
和int addr;
。但是,我所做的clone
方法给了我错误的价值。
public class Calle{
String nombre;
int addr;
public Object clone(){
return this;
}
}
Calle c1 = new Calle("a",1);
Calle c2 = c1.clone();
c2.setAddr(3);
System.out.println(c1.addr); // value wrong
为什么价值不对?
答案 0 :(得分:3)
你的克隆方法是错误的,因为它并没有真正克隆任何东西,它只是返回相同的对象。 clone
应始终为新对象,其值与原始对象相同。
在这种情况下,您看起来已经有了一个复制构造函数,所以只需使用它来创建新的Calle
并将其返回。
public Object clone(){
return new Calle(this.nombre, this.addr);
}
答案 1 :(得分:2)
对于您的情况,您可以使用Object提供的标准浅克隆方法。只要String是不可变的并且将复制int值,就没有理由重写复制逻辑。只是让它可见。
public Object clone(){
return super.clone();
}
Cloneable接口也应该实现。
答案 2 :(得分:1)
你的克隆方法是错误的,因为它并没有真正克隆任何东西,它只是返回相同的对象。
public Object clone() throws CloneNotSupportedException{
return super.clone();
}
这种克隆只会进行浅层克隆。如果你想要深度克隆,你需要编写你想要克隆的逻辑。