修改方法中的arraylists并按值传递

时间:2012-11-22 02:37:08

标签: java cloning

我今天发布了this帖子关于深度复制的内容,并提出了一些问题:

在第一个代码中,作者说在克隆中添加一个(整数)对象不会出现在原始代码中。为什么会这样?据我所知,克隆基本上创建了一个对象,其对象的引用与原始对象相同。

为什么克隆中的更改不会反映在原始文件中?

克隆是否与原始版本共享相同的引用?

2 个答案:

答案 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关于信息)

这是一个说明性的例子:

Before Copy Shallow Copying Shallow Done

深:

Before Copy Deep Copying Deep Done