对象克隆浅拷贝不会更改变量

时间:2012-03-22 20:29:35

标签: java clone

我尝试克隆一个对象并更改新clonned对象的成员函数。如果是浅拷贝并且根据维基页面,浅拷贝和原始对象则指向同一个对象,它应该改变变量值。

    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中。它不会发生。任何人都可以解释一下(我理解克隆是为了给我们提供对象的副本,但如果它是浅拷贝,那么为什么我们需要浅拷贝?,我们应该总是去深拷贝)。 谢谢。

3 个答案:

答案 0 :(得分:4)

obj1 的浅拷贝会创建CloneExample类的另一个实例 obj2(obj1!= obj2)。  他们不分享价值会员。

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

In Java, what is a shallow copy?

答案 1 :(得分:3)

为什么你认为克隆是浅拷贝?见这里:http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#clone()

正如它所说 - 克隆所做的是依赖于实现的。 “浅拷贝”也不是简单地创建对同一对象的新引用 - 通常它意味着创建一个新实例,其内部成员与复制的对象相同。但是,如果将新obj的成员变量更改为指向新的obj,则不会更改原始obj的成员变量。

答案 2 :(得分:0)

调用object.clone()时,会创建新对象。因此,您将获得对此对象的引用。只有原始类型字段的对象可以完美克隆。因此,您可以完全独立于您的obj1副本。但是,如果您的对象包含带引用的字段,则需要进行深度克隆。