在java浅拷贝中是clone()吗?

Jos*_*son 10 java deep-copy shallow-copy

clone()Java中的浅拷贝?

最终,这将获得Object的clone()方法(最上层的类),它创建与对象相同的类的新实例,并将所有字段复制到新实例("浅拷贝").

我是从维基百科读到的.

我不明白为什么它是浅拷贝.clone()将创建一个包含所有字段的新实例.这只是一个很深的副本吗?困惑.需要一些解释.

Chr*_*ung 17

默认Object.clone()值确实是浅拷贝.但是,CloneNotSupportedException除非您的对象实现,否则它将被设计为抛出Cloneable.

在实现时Cloneable,您应该clone()通过调用clone()本身可复制的所有字段来覆盖以使其执行深层复制.

  • 使克隆深或浅不是"应该"或"不应该"类型的东西,它完全取决于预期的用途. (7认同)
  • @jtahlborn:这确实是一个"应该"的事情,因为其他人称你的'克隆'将会期待所描述的行为.当然,也有例外,例如通用容器(@jt的回答).但总的来说,这是期望. (3认同)
  • 实际上,考虑到所有容器都使用浅层克隆,为什么你会声称深层次是期望?(容器是jdk中唯一可以克隆的可变类,我能想到). (2认同)
  • 对于深度复制,您可以序列化对象(在内存中)并反序列化为新对象。这将是一个精确的克隆(深拷贝) (2认同)

krt*_*tek 6

这是一个浅表副本,因为它仅复制对其他对象的引用。说我们有这些课程:

class A {
    B variable
    A() {
        variable = new B();
    }
}

class B { }
Run Code Online (Sandbox Code Playgroud)

现在我们克隆一个A实例:

A firstA = new A();
A secondA = firstA.clone();
Run Code Online (Sandbox Code Playgroud)

firstA和secondA中的B实例将相同。您将没有B实例的副本。这就是为什么称clone()做浅拷贝的原因。

您链接的页面上的图表应有助于您理解所有内容。


Bri*_*new 5

顺便说一句,我很惊讶没有人提到Joshua Bloch对Cloneable的看法

如果您已经阅读了我的书中有关克隆的项目,特别是如果您在这些内容之间进行了阅读,您将会知道我认为克隆已经深受打击.存在一些设计缺陷,其中最大的一个是Cloneable接口没有克隆方法.这意味着它根本不起作用:制作一些Cloneable并没有说明你可以用它做什么.相反,它说明了内部可以做些什么.它说如果通过反复调用super.clone它最终调用Object的clone方法,这个方法将返回原始的字段副本.