Java 使用对象类的clone()方法克隆对象
如果要克隆的对象所在的类包含与另一个类的对象类似的非基本数据类型,则此对象中所做的更改将反映在两个对象中(即原始对象和克隆对象)?虽然在基本数据类型中所做的更改只反映在克隆对象中,但为什么Java 使用对象类的clone()方法克隆对象,java,Java,如果要克隆的对象所在的类包含与另一个类的对象类似的非基本数据类型,则此对象中所做的更改将反映在两个对象中(即原始对象和克隆对象)?虽然在基本数据类型中所做的更改只反映在克隆对象中,但为什么 import static java.lang.System.*; class Best { int x; int y; } class Test implements Cloneable { int a; int b; Best bt = new Best();
import static java.lang.System.*;
class Best
{
int x;
int y;
}
class Test implements Cloneable
{
int a;
int b;
Best bt = new Best();
public Object clone()throws CloneNotSupportedException
{
return super.clone();
}
}
public class Check
{
public static void main(String [] args) throws CloneNotSupportedException
{
Test t1 = new Test();
t1.a=20;
t1.b=30;
t1.bt.x = 300;
t1.bt.y = 200;
Test t2 = (Test)t1.clone();
t2.a=50; //change reflects only in cloned object
t2.bt.x = 500; //change reflects in both original and cloned object
out.println(t1.a+" "+t1.b+" "+t1.bt.x+" "+t1.bt.y);
out.println(t2.a+" "+t2.b+" "+t2.bt.x+" "+t2.bt.y);
}
}
Java clone()方法只创建浅拷贝,这意味着原始数据类型字段的值被复制,而对象类型字段的引用被复制。在您的示例中,这将导致两个对象“共享”一个最佳对象
要完成深度复制,即创建新对象而不是引用现有对象,您需要在重写的clone()方法中创建一个新的Best对象,并手动指定值或使Best cloneable。我更喜欢使Best cloneable,因为更改Best类的字段不需要更改测试类的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;
}
}
因为克隆不会深度克隆。谷歌it:
Java中的深度复制与浅层复制