我在java中提出了一个关于克隆的问题,并得到了答案,说深层复制会在成员变量中创建一个带有相同状态和数据的对象的新实例。我被告知浅层复制只是将对象引用分配给另一个引用变量。但那不是复制那个分配(为对象位置制作一个新指针)。
如果您尝试克隆的对象中包含引用变量,那么对象的深度复制是什么呢?使用myObj2 = myObj.clone()
克隆对象中的所有组件?让我们说如果myObj包含指向其他对象位置的其他引用变量,那么这些引用变量是否也会被克隆?所以myObj2的内部引用变量不会指向myObj中指向指针的指针所在的旧对象位置。我需要清楚这里才能完全理解克隆的内容。
提前谢谢。
答案 0 :(得分:1)
我可以给你一个不满意的答案:"清晰度需要"将无法使用。 :)
问题是,这是java.lang.Object.clone()
的{{3}}的前两句话:
创建并返回此对象的副本。 " copy"的确切含义可能取决于对象的类别。 (强调添加)
所以这取决于班上的作者。
如果您阅读有关clone()
的更多文档,则表明它应该实现深层副本(按值复制所有对象,而不是引用)。例如:
通常,这意味着复制任何包含内部"深层结构的可变对象"被克隆的对象,并用对副本的引用替换对这些对象的引用。
但是clone()
的默认实现不会这样做:
否则,此方法创建此对象的类的新实例,并使用该对象的相应字段的内容初始化其所有字段,就像通过赋值一样;这些字段的内容本身不会被克隆。因此,这种方法执行一个浅拷贝"这个对象,而不是"深拷贝"操作的
所以它取决于类,以及作者如何解释上述语义(假设作者理解它们)。