Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 克隆人是如何工作的?_Java_Clone - Fatal编程技术网

Java 克隆人是如何工作的?

Java 克隆人是如何工作的?,java,clone,Java,Clone,克隆不会调用对象构造函数来创建对象的副本。那么克隆使用什么算法呢 我正在寻找本机方法克隆的实现细节。任何指点都将不胜感激 请注意,我知道克隆的缺点。受保护的本机对象克隆()。我不太清楚(我需要看一下本机代码),但它在JVM中创建了一个新的对象实例,并复制了所有字段 但是您应该避免使用clone()——这很难做到正确。有关更多详细信息,请参见它的工作原理如所示: classObject的方法clone执行特定的克隆操作。首先,如果该对象的类没有实现接口Cloneable,则抛出CloneNotSu

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

我正在寻找本机方法克隆的实现细节。任何指点都将不胜感激


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

受保护的本机对象克隆()
。我不太清楚(我需要看一下本机代码),但它在JVM中创建了一个新的对象实例,并复制了所有字段


但是您应该避免使用
clone()
——这很难做到正确。有关更多详细信息,请参见

它的工作原理如所示:

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

例如,一个简单、浅的逐场拷贝,非常接近(但可能不是完全)对象的逐位拷贝

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


这将因JVM实现而异。不过,如果您担心的话,这可能是一个非常有效的操作。

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

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


但是,在Java中,
clone
/
Clonable
机制从根本上被打破了。约书亚·布洛赫在书中有一节是关于它的。还有一些与此相关的问题。

hmm……我正在考虑本机实现是如何完成的。+1表示Joshua Block的链接,但它也被破坏了,就像克隆功能一样。以下是我们可以直接阅读的内容: