我今天读了关于深度复制的this帖子,并提出了一些问题:
在第一个代码中,作者说在克隆中添加一个(整数)对象不会出现在原始代码中。为什么会这样?据我所知,克隆基本上创建了一个对象,其对象的引用与原始对象相同。
为什么克隆中的变化不会反映在原始中?
克隆是否与原始共享相同的引用?
当您复制Object 'A'
时,您正在创建一个新的Object 'B'
(对对象具有相同的引用),但是在不同的内存地址中。因此,当您修改对象'A'时,您没有访问Object 'B'
的相同内存地址。因此,克隆中的更改不会反映在原始对象中,反之亦然。
浅拷贝
通常,对象的clone方法创建同一个类的新实例,并将所有字段复制到新实例并返回它。这只不过是浅色的副本。 Object类提供克隆方法并为浅拷贝提供支持。它返回'Object'作为类型,您需要显式地转换回原始对象。
深拷贝
当您需要深层复制时,您需要自己实现它。当复制的对象包含某些其他对象时,其引用将在深层副本中以递归方式复制。实现深层副本时要小心,因为您可能会遇到循环依赖。如果您不想自己实施深层复制,那么您可以进行序列化。它确实实现了深层复制,并且可以优雅地处理循环依赖。
(source有关信息)
这是一个说明性示例:
浅
深:
克隆的整个目的是与原始目的不同 - 因此克隆中的变化不会反映在原始中。否则,你可以使用简单的赋值而不是克隆。
EG
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的维基百科文章。