Java 浅复制-新实例或分配
浅复制是指对象的“复制”,其属性值(无论是基本值还是参考值)相同 执行浅复制时是否需要“创建新实例”?作为: 或按任务复制也被视为浅层复制:Java 浅复制-新实例或分配,java,Java,浅复制是指对象的“复制”,其属性值(无论是基本值还是参考值)相同 执行浅复制时是否需要“创建新实例”?作为: 或按任务复制也被视为浅层复制: B b = new B(10); A a = new A(1, b); A a1 = a; 维基百科将浅拷贝定义为共享同一内存块的引用变量。因此,根据这一副本的分配,也将是一个浅副本 但它不是指向同一对象的变量,而不是对象的“副本”吗?赋值不是副本,它只是对同一实例的第二次引用 副本必须是新实例,否则它不是副本;这只是另一个参考 执行浅复制时是否需要“
B b = new B(10);
A a = new A(1, b);
A a1 = a;
维基百科将浅拷贝定义为共享同一内存块的引用变量。因此,根据这一副本的分配,也将是一个浅副本
但它不是指向同一对象的变量,而不是对象的“副本”吗?赋值不是副本,它只是对同一实例的第二次引用 副本必须是新实例,否则它不是副本;这只是另一个参考 执行浅复制时是否需要“创建新实例”?作为: 是的,这是必要的 或按任务复制也被视为浅层复制:
B b = new B(10);
A a = new A(1, b);
A a1 = a;
不,这是一个完全不同的操作。没有副本;这只是创建对现有对象的新引用。如果通过此新引用修改对象,则仍在修改原始对象。引用指定不会创建新对象,而只是指向现有对象 在执行浅复制时,是否需要“创建一个新的 例如“ 是,您必须创建一个实例来创建对象的副本(无论是
浅的
还是深的
)。只需分配引用即可创建指向同一实例的引用副本
您使用了一种非静态方法,该方法正在创建一个副本
。但一般来说,我喜欢两种方式:-
使用复制构造函数
:-
public A(A obj) {
copy.aValue = obj.aValue;
}
然后像这样使用它:-
A first = new A();
A copy = new A(first);
或者,使用公共静态方法
,该方法获取一个实例并返回该实例的副本
public static A createCopy(A obj) {
A copy = new A();
copy.aValue = obj.aValue;
return copy;
}
这就意味着,在维基上,浅层复制的定义是错误的,而且也是错误的http://stackoverflow.com/questions/6182565/java-deep-copy-shallow-copy-clone杰伊·埃尔斯顿给出的例子是错误的。@aLearner:我认为你误读了你提到的材料。为什么不使用非静态方法来创建复制我觉得这完全合理@阿库恩。是的,这是合理的。这都是用户的偏好。我更喜欢
复制构造函数
或静态工厂
。嗯,我已经编辑了我的这一行。谢谢:)在浅层复制中,您只复制引用而不是原语
-听起来很奇怪!。我认为,在复制时,我们会复制我们想要的所有属性。@aLearner。。这就是为什么我们有不同类型的副本。是Deep copy
复制了所有属性。不在浅拷贝中
@aLearner。看到这个帖子了吗-