关于java:Object Clone浅拷贝不会改变变量

Object Clone Shallow copy doesn't change variable

我尝试克隆一个对象并更改新克隆对象的成员函数。如果是浅复制,并且根据wiki页面,浅复制和原始对象指向同一个对象,那么它应该更改变量值。

1
2
3
4
5
6
7
8
9
10
11
    CloneExample obj1=new CloneExample();
    CloneExample obj2=(CloneExample) obj1.clone();
    obj1.a=2;
    obj1.c='a';
    System.out.println("obj1 real"+obj1.a+""+obj1.c);
    System.out.println("obj2 real"+obj2.a+""+obj2.c);
    obj2.a=99;
    obj2.c='z';
    System.out.println("obj2 after change"+obj2.a+""+obj2.c);
    System.out.println("obj1 after change"+obj1.a+""+obj1.c);
    System.out.println("obj1="+obj1+" obj2="+obj2);

如果这个克隆是浅拷贝,那么obj2和obj1指向相同的引用obj,修改obj2应该反映在obj1中。不会发生的。有人能解释一下吗(我知道克隆是为了给我们对象的拷贝,但如果它是浅拷贝,那么为什么我们需要浅拷贝呢?我们应该一直进行深入研究)。谢谢您。


obj1的浅拷贝创建了克隆的另一个实例obj2示例类(obj1!= Obj2)。他们不分享有价值的成员。

但是如果我们的类包含一个引用类型,例如java.util.Date,那么如果它们共享对该java.util.Date的引用,那么更改它的值将反映在这两个对象中。

在爪哇,什么是肤浅的复制?


为什么你认为克隆是一个肤浅的复制品?请参见:http://DOCS.Oracle .COM/JavaSe/ 6 /DOCS/API/Java/Lang/Objult.

正如它所说的-克隆所做的是依赖于实现的。另外,"浅副本"并不仅仅创建对同一对象的新引用,一般来说,它意味着创建一个新实例时使用的内部成员与从中复制的对象相同。但是,如果将新obj的成员变量更改为指向新对象,则不会更改原始obj的成员变量。


调用object.clone()时,将创建新对象。因此,您得到了对这个对象的引用。只有基元类型字段的对象是完全克隆的。结果,你得到了一个完全独立于你的obj1拷贝。但是,如果对象具有带引用的字段,则需要进行深度克隆。