由值

2012-11-22 12 views
2

的方法和通过修改的ArrayList我读this邮政今日关于深度复制,并有几个问题:由值

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

为什么克隆中的变化没有反映回原来的?

不克隆与原始文件共享相同的参考吗?

+0

你误解了克隆。一旦对象被克隆,将会有一个新的对象。它们是不同的对象,所以你在B上改变从不影响A.然而,在浅层克隆中,一些成员将在这两个对象上共享,因为这些成员的引用也被克隆。 –

+0

所以,如果我添加一个类对象到原来的,它不应该显示在克隆中,反之亦然? – Floose

回答

3

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

浅复制

一般克隆对象的方法,创建了同一个类,并将所有领域的新实例的新实例,并将其返回。这只不过是浅拷贝。对象类提供了一种克隆方法,并为浅拷贝提供支持。它将类型返回为“Object”,并且需要明确地将其转换回原始对象。

深复制

当你需要一个深拷贝,那么你需要实现它自己。当复制的对象包含其他对象时,其引用将以深度复制的方式递归复制。当您实施深度复制时,请小心,因为您可能会陷入循环依赖。如果你不想实现深层复制,那么你可以去序列化。它确实隐式地实现了深层复制,并且正常地处理循环依赖。

这里一个说明性示例:

Before Copy Shallow Copying Shallow Done

深:

Before Copy Deep Copying Deep Done

4

克隆的整体目的是为不同于原来的--所以克隆的变化都不是体现在原来的。否则,你可以使用简单的分配而不是克隆。

例如

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