浅拷贝 - 新实例或赋值

时间:2012-12-02 08:11:11

标签: java

浅拷贝是指具有相同属性值的对象的“copy”,无论是原始值还是参考值。

执行浅拷贝时,是否需要“创建新实例”?为:

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”吗?

4 个答案:

答案 0 :(得分:4)

  

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

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

您使用了创建non-static method的{​​{1}}。但通常我更喜欢两种方式: -

使用copy: -

copy-constructor

并使用它: -

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

或者,使用A first = new A(); A copy = new A(first); 获取实例并返回该副本。

public static method

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

  

执行浅拷贝时,是否需要“创建新实例”?为:

是的,这是必要的。

  

或按作业复制也被视为浅拷贝:

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

答案 3 :(得分:0)

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