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。看到这个帖子了吗-