克隆如何在引擎盖下工作?

时间:2011-07-26 06:09:48

标签: java clone

Clone不会调用对象构造函数来创建对象的副本。那么克隆使用什么算法呢?

我正在寻找本机方法克隆的实现细节。任何指针都将受到赞赏。

请注意,我知道克隆的缺点。

4 个答案:

答案 0 :(得分:3)

protected native Object clone()。我不确切知道(我需要查看本机代码)但是它在JVM中创建了一个新对象并复制了所有字段。

但是你应该避免使用clone() - 很难做到正确。请查看this question了解更多详情

答案 1 :(得分:3)

如何运作在the Javadoc中列出:

  

clone的方法Object执行特定的克隆操作。首先,如果此对象的类未实现接口Cloneable,则抛出CloneNotSupportedException。请注意,所有数组都被视为实现Cloneable接口。否则,此方法创建此对象的类的新实例,并使用该对象的相应字段的内容初始化其所有字段,就像通过赋值一样;这些字段的内容本身不会被克隆。因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作。

,例如,一个天真的,浅层的逐字段拷贝,非常接近(但可能不完全)只是对象的一点一滴副本。

  

我正在寻找本机方法克隆的实现细节。

这将从JVM实现到JVM实现不等。但是,如果你担心的话,这可能是一个非常有效的操作。

答案 2 :(得分:1)

就JNI而言,clone是(或可能)使用AllocObject方法实现的,该方法在不调用任何构造函数(而不是NewObject)的情况下创建新对象。当您拥有新对象时,反射用于浅层复制所有字段。

但话说回来,clone / Clonable机制在Java中从根本上被打破了。 Joshua Bloch在Effective Java中有一节介绍它。关于它还有几个相关的SO questions

答案 3 :(得分:0)

Object.clone()实现是一种本机方法,它检查对象的类是否实现Cloneable,然后简单地分配一个新实例并进行逐字段浅拷贝。复制很可能是使用内存副本完成的 - 没有必要做任何更奇特的事情。 (但如果您真的想知道,请查看OpenJDK源代码。)