首页 文章

克隆需要清晰度:对象的浅层复制不仅仅是将对象引用变量分配给另一个变量,还是它? [重复]

提问于
浏览
0

这个问题在这里已有答案:

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

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

先感谢您 .

1 回答

  • 1

    我可以给你一个不满意的答案:“所需的清晰度”将无法获得 . :)

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

    创建并返回此对象的副本 . The precise meaning of "copy" may depend on the class of the object. (重点补充)

    所以这取决于 class 的作者 .

    如果您阅读 clone() 上的进一步文档,则表明它应该实现深层复制(按值复制所有对象,而不是引用) . 例如:

    通常,这意味着复制包含要克隆的对象的内部"deep structure"的任何可变对象,并使用对副本的引用替换对这些对象的引用 .

    但是 clone() 的默认实现不会这样做:

    否则,此方法创建此对象的类的新实例,并使用该对象的相应字段的内容初始化其所有字段,就像通过赋值一样;这些字段的内容本身不会被克隆 . 因此,此方法执行此对象的"shallow copy",而不是"deep copy"操作 .

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

相关问题