如果要克隆的对象的类包含非原始数据类型(如另一个类的对象),那么在此对象中所做的更改会同时反映在两个对象中(即原始对象和克隆对象)?虽然对原始数据类型所做的更改仅反映在克隆对象中,为什么?
move dir1\*.jpg dir2\...
答案 0 :(得分:3)
Java clone()方法仅创建一个浅拷贝,这意味着将复制原始数据类型字段的值,但复制对象类型字段的引用。在您的示例中,这导致两个对象“共享”一个Best对象。
要完成深层复制,在其中创建一个新对象而不是引用现有对象,则需要在覆盖的clone()方法中创建一个新的Best对象,然后分配值手动或使Best可克隆。我更喜欢使Best可克隆,因为更改Best类的字段不需要更改Test类的clone()方法。尝试以这种方式创建深层副本时,最重要的事情是必须始终克隆下来,直到仅到达原始数据字段为止,这并不总是合理/可行的。如果是这种情况,只需手动分配值即可。
实现最佳克隆:
class Best implements Cloneable
{
int x;
int y;
public Object clone() throws CloneNotSupportedException
{
return super.clone();
}
}
class Test implements Cloneable
{
int a;
int b;
Best bt = new Best();
public Object clone()throws CloneNotSupportedException
{
Test t = (Test) super.clone();
t.bt = (Best) this.bt.clone();
return t;
}
}
手动分配值:
class Best
{
int x;
int y;
}
class Test implements Cloneable
{
int a;
int b;
Best bt = new Best();
public Object clone()throws CloneNotSupportedException
{
Test t = (Test) super.clone();
t.bt.x = this.bt.x;
t.bt.y = this.bt.y;
return t;
}
}