4

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

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

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;

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

但它不是指向同一对象的变量而不是 Object 的“副本”吗?

4

4 回答 4

4

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

是的,您必须创建一个实例来创建对象的副本(或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);

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

public static A createCopy(A obj) {
    A copy = new A();
    copy.aValue = obj.aValue;
    return copy;
}
于 2012-12-02T08:17:40.217 回答
3

赋值不是副本——它只是对同一实例的第二次引用。

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

于 2012-12-02T08:12:11.453 回答
0

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

是的,这是必要的。

或者赋值复制也被认为是浅拷贝:

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

于 2012-12-02T08:15:20.983 回答
0

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

于 2012-12-02T08:16:01.933 回答