我今天发布了this帖子关于深度复制的内容,并提出了一些问题:
在第一个代码中,作者说在克隆中添加一个(整数)对象不会出现在原始代码中。为什么会这样?据我所知,克隆基本上创建了一个对象,其对象的引用与原始对象相同。
为什么克隆中的更改不会反映在原始文件中?
克隆是否与原始版本共享相同的引用?
答案 0 :(得分:4)
克隆的整个目的是与原始不同,因此克隆中的更改不会反映在原始文件中。否则,你可以使用简单的赋值而不是克隆。
e.g。
MyClass a = new MyClass(); // some cloneable class
MyClass b = a; // not a clone, changes to `b` will affect in `a`
// assignment duplicates the reference
-or-
MyClass b = a.clone(); // clone, changes to `b` will not affect in `a`
// clone duplicates the object
实际上有一篇关于Java克隆的维基百科文章here。
答案 1 :(得分:3)
当您复制Object 'A'
时,您正在创建一个新的Object 'B'
(对对象具有相同的引用),但是在不同的内存地址中。因此,当您修改对象“A”时,您不会访问Object 'B'
的相同内存地址。因此,克隆中的更改不会反映在原始对象中,反之亦然。
浅拷贝
通常,对象的clone方法会创建同一个类的新实例,并将所有字段复制到新实例并返回它。这只不过是浅色的副本。 Object类提供克隆方法并为浅拷贝提供支持。它返回'Object'作为类型,您需要显式地转换回原始对象。
深层复制
当您需要深层复制时,您需要自己实施。当复制的对象包含某些其他对象时,其引用将在深层副本中以递归方式复制。实现深层副本时要小心,因为您可能会遇到循环依赖。如果您不想自己实施深层复制,那么您可以进行序列化。它确实实现了深度复制,并且可以优雅地处理循环依赖。
(source关于信息)
这是一个说明性的例子:
浅
深: