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

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

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


当你调用object.clone()时,会创建一个新的对象。 因此,您可以参考此对象。 只有原始类型字段的对象完全克隆。 因此,您可以从obj1副本中获得完全独立。 但是如果你的对象有引用的字段,你需要做一个深层次的克隆。


为什么你认为克隆是一个浅拷贝? 请参阅此处:http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#clone()

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


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

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

在Java中,什么是浅拷贝?

链接地址: http://www.djcxy.com/p/6967.html

上一篇: Object Clone Shallow copy doesn't change variable

下一篇: modifying cloned objects