首页 文章

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

提问于
浏览
1

我试图克隆一个对象并更改新的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 回答

  • 4

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

  • 3

    您的CloneExample类(obj1!= obj2)的obj1 creates another instance obj2的浅拷贝 . 他们不共享 Value 成员 .

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

    In Java, what is a shallow copy?

  • 0

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

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

相关问题