【问题标题】:Clarity needed on cloning: Shallow copying of objects is NOT just assigning object reference variable to another variable or is it? [duplicate]克隆需要明确:对象的浅拷贝不仅仅是将对象引用变量分配给另一个变量,还是这样? [复制]
【发布时间】:2014-07-02 11:59:28
【问题描述】:

我问了一个关于在 java 中克隆的问题,得到的答案是深拷贝会创建一个新的对象实例,该实例在成员变量中携带相同的状态和数据。有人告诉我浅拷贝只是将对象引用分配给另一个引用变量。但这不是复制那个分配(为对象位置创建一个新指针)。

如果您尝试克隆的对象中包含引用变量,那么什么是对象的深度复制?会使用myObj2 = myObj.clone() 克隆对象中的所有组件吗?假设 myObj 包含指向其他对象位置的其他引用变量,这些引用变量也会被克隆吗?因此,myObj2 的内部引用变量不会指向与 myObj 中的指针指向的相同的旧对象位置。我需要在此处明确说明以完全了解克隆的全部内容。

提前谢谢你。

【问题讨论】:

    标签: java clone cloneable


    【解决方案1】:

    我可以给你一个不满意的答案:“需要的清晰度”将不可用。 :)

    问题是,这里是documentation for java.lang.Object.clone()的前两句:

    创建并返回此对象的副本。 “复制”的确切含义可能取决于对象的类别。(已添加重点)

    所以这取决于课程的作者。

    如果您阅读clone() 上的进一步文档,它建议它应该实现一个深拷贝(按值复制所有对象,而不是引用)。例如:

    通常,这意味着复制包含被克隆对象的内部“深层结构”的任何可变对象,并将对这些对象的引用替换为对副本的引用。

    但是clone()的默认实现并没有这样做:

    否则,此方法会创建此对象的类的新实例,并使用此对象的相应字段的内容来初始化其所有字段,就像通过赋值一样;字段的内容本身不会被克隆。因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作。

    所以这取决于类,以及作者如何解释上述语义(假设作者理解它们)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 2015-08-10
      • 2011-09-05
      相关资源
      最近更新 更多