【问题标题】:shallow copy - new instance Or assignment浅拷贝 - 新实例或赋值
【发布时间】:2012-11-19 23:49:03
【问题描述】:

浅拷贝是指对象的“拷贝”,无论是原始值还是引用值,其属性值都相同。

在执行浅拷贝时是否需要“创建一个新实例”?如:

public class A {
    int aValue;
    B bObj;

    ...

    public A createShallow(A a1Obj) {
        A aObj = new A();
        aObj.aValue = a1Obj.aValue;
        aObj.bObj = a1Obj.bObj;

        return aObj;
    }
}

或者通过赋值复制也算是浅拷贝:

B b = new B(10);
A a = new A(1, b);

A a1 = a;

维基百科上的 article 将浅拷贝定义为引用变量共享相同的内存块。所以按这个copy by assignment也会是浅拷贝。

但它不是一个指向同一个对象的变量,而不是一个对象的“复制”吗?

【问题讨论】:

    标签: java


    【解决方案1】:

    在执行浅拷贝时,有必要“创建一个新的 实例”?

    是的,您必须创建一个实例才能创建对象的副本(shallowdeep)。仅仅进行引用分配只会创建一个指向同一个实例的copy of reference

    您使用了一个non-static method,它正在创建一个copy。但通常我更喜欢两种方式:-

    要么使用copy-constructor:-

    public A(A obj) {
        copy.aValue = obj.aValue;
    }
    

    并像这样使用它:-

    A first = new A();
    A copy = new A(first);
    

    或者,使用public static method,它接受一个实例并返回该实例的副本。

    public static A createCopy(A obj) {
        A copy = new A();
        copy.aValue = obj.aValue;
        return copy;
    }
    

    【讨论】:

    • 为什么不应该使用非静态方法来创建副本?这对我来说听起来完全合理!
    • @akuhn。是的,这是合理的。这都是用户的偏好。我更喜欢copy constructorstatic factory。好吧,我已经编辑了我的那一行。谢谢:)
    • In shallow copy, you just copy the references and not primitives- 听起来很奇怪!我认为在复制时,我们会复制我们想要的所有属性。
    • @aLearner.. 这就是为什么我们有不同类型的副本。复制所有属性的是Deep copy。不在shallow copy
    • @aLearner。看到这篇文章 - stackoverflow.com/questions/1175620/…
    【解决方案2】:

    分配不是副本 - 它只是对同一实例的第二次引用。

    copy 必须是新实例,否则不是副本;这只是另一个参考。

    【讨论】:

      【解决方案3】:

      在执行浅拷贝时是否有必要“创建一个新实例”?如:

      是的,这是必要的。

      或者赋值复制也算是浅拷贝:

      不,这是完全不同的操作。没有副本;这只是创建对现有对象的新引用。如果你通过这个新的引用来修改对象,你仍然在修改原来的对象。

      【讨论】:

      • 那么这意味着在 wiki 中浅拷贝的定义是错误的,并且在 SO 问题 http://stackoverflow.com/questions/6182565/java-deep-copy-shallow-copy-cloneJay Elston 给出的示例是错误的。
      • @aLearner:我认为您误读了您所指的材料。
      【解决方案4】:

      引用赋值不会创建新对象,而只是指向现有对象。

      【讨论】:

        猜你喜欢
        • 2012-04-13
        • 1970-01-01
        • 1970-01-01
        • 2013-06-19
        • 2012-04-12
        • 2012-02-28
        • 2015-08-01
        相关资源
        最近更新 更多