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

问题描述 投票:2回答:2

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

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

为什么克隆中的变化不会反映在原始中?

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

java cloning
2个回答
3
投票

当您复制Object 'A'时,您正在创建一个新的Object 'B'(对对象具有相同的引用),但是在不同的内存地址中。因此,当您修改对象'A'时,您没有访问Object 'B'的相同内存地址。因此,克隆中的更改不会反映在原始对象中,反之亦然。

浅拷贝

通常,对象的clone方法创建同一个类的新实例,并将所有字段复制到新实例并返回它。这只不过是浅色的副本。 Object类提供克隆方法并为浅拷贝提供支持。它返回'Object'作为类型,您需要显式地转换回原始对象。

深拷贝

当您需要深层复制时,您需要自己实现它。当复制的对象包含某些其他对象时,其引用将在深层副本中以递归方式复制。实现深层副本时要小心,因为您可能会遇到循环依赖。如果您不想自己实施深层复制,那么您可以进行序列化。它确实实现了深层复制,并且可以优雅地处理循环依赖。

source有关信息)

这是一个说明性示例:

深:


4
投票

克隆的整个目的是与原始目的不同 - 因此克隆中的变化不会反映在原始中。否则,你可以使用简单的赋值而不是克隆。

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的维基百科文章。

© www.soinside.com 2019 - 2024. All rights reserved.