浅拷贝是指具有相同属性值的对象的“复制”,无论是原始值还是引用值。
在执行浅层复制时,是否需要“创建一个新实例”?作为:
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;维基百科的文章将浅拷贝定义为共享相同内存块的引用变量。因此,根据这个副本的分配,也将是一个浅的副本。
但是,它不是指向同一个对象的变量,而不是对象的“复制”吗?
发布于 2012-12-02 08:17:40
在执行浅层复制时,是否需要“创建一个新实例”?
是的,您必须创建一个实例来创建对象的副本( shallow或deep)。只需执行引用的赋值,就会创建指向同一个实例的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;
}发布于 2012-12-02 08:12:11
赋值不是副本--它只是对同一个实例的第二个引用。
一个副本必须是一个新实例,否则它不是一个副本;它只是另一个引用。
发布于 2012-12-02 08:15:20
在执行浅层复制时,是否需要“创建一个新实例”?作为:
是的,这是必要的。
或者按任务复制也被认为是浅拷贝:
不,这是一个完全不同的行动。没有副本;这只是创建了对现有对象的新引用。如果通过此新引用修改对象,则仍在修改原始对象。
https://stackoverflow.com/questions/13667556
复制相似问题