【发布时间】:2011-10-13 03:35:16
【问题描述】:
Clone 不会调用对象构造函数来创建对象的副本。那么克隆使用什么算法呢?
我正在寻找本地方法克隆的实现细节。任何指针将不胜感激。
请注意,我知道克隆的缺点。
【问题讨论】:
Clone 不会调用对象构造函数来创建对象的副本。那么克隆使用什么算法呢?
我正在寻找本地方法克隆的实现细节。任何指针将不胜感激。
请注意,我知道克隆的缺点。
【问题讨论】:
protected native Object clone()。我不太清楚(我需要看一下本机代码),但它会在 JVM 中创建一个对象的新实例并复制所有字段。
但您应该避免使用clone() - 很难做到正确。查看this question了解更多详情
【讨论】:
它的工作原理在the Javadoc:
Object类的方法clone执行特定的克隆操作。首先,如果这个对象的类没有实现接口Cloneable,那么会抛出一个CloneNotSupportedException。请注意,所有数组都被认为实现了接口 Cloneable。否则,此方法会创建此对象的类的新实例,并使用此对象的相应字段的内容来初始化其所有字段,就像通过赋值一样;字段的内容本身不会被克隆。因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作。
例如,一个简单的逐个字段的浅拷贝,非常接近(但可能不完全是)对象的逐位拷贝。
我正在寻找本地方法克隆的实现细节。
这会因 JVM 实现而异。不过,如果您担心的话,这可能是一项非常有效的操作。
【讨论】:
就 JNI 而言,clone 是(或可能是)使用 AllocObject 方法实现的,该方法在不调用任何构造函数的情况下创建一个新对象(与 NewObject 相反)。当您拥有新对象时,反射用于浅层复制所有字段。
不过话说回来,clone/Clonable 机制在 Java 中根本就被破坏了。 Joshua Bloch 在Effective Java 中有一个关于它的部分。还有几个相关的SO questions关于它。
【讨论】:
Object.clone() 实现是一个本地方法,它检查对象的类是否实现了Cloneable,然后简单地分配一个新实例并逐个字段进行浅拷贝。复制很可能是使用内存副本完成的——它不需要做任何更花哨的事情。 (但如果你真的想知道,请查看 OpenJDK 源代码。)
【讨论】: