浅拷贝是指具有相同属性值的对象的“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”吗?
答案 0 :(得分:4)
执行浅拷贝时,有必要“创建一个新的 实例“?
是的,您必须创建一个实例来创建对象的副本(shallow
或deep
)。只进行引用分配只会创建一个指向同一实例的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)
引用赋值不会创建新对象,只会指向现有对象。