Object类如何实现clone()方法

时间:2011-03-21 08:29:38

标签: java class object clone core

在一本关于Core Java的书中,我发现了这段摘录:

  

想想的方式   对象类可以实现克隆。它   什么都不知道对象,   所以它只能逐场进行   复制。如果对象中的所有数据字段   是数字或其他基本类型,   复制字段就好了。但   如果对象包含对的引用   子对象,然后复制字段   给你另一个参考   子对象,所以原来和   克隆的对象仍然分享一些   信息。

读完之后,我想知道How is the clone method originally implemented in Object Class?

困扰我的是:Object类中的一个方法如何通过子类对象的字段克隆来创建一个字段,而它对该类一无所知?

2 个答案:

答案 0 :(得分:12)

实际上,clone()是在本机代码中实现的,所以我假设它只是在不知道内容的情况下进行内存复制(复制所有字节)。

除此之外,还有Reflection API可以获得关于某个类的知识(然而,这会更慢)。

答案 1 :(得分:1)

Javadoc

中读取此内容
  

protected Object clone() -

     

创建并返回此副本   宾语。 “复制”的确切含义   可能取决于对象的类。   一般意图是,对任何人   对象x,表达式:

     

x.clone()!= x

     

将是真的,表达式为:

     

x.clone()。getClass()== x.getClass()

     

将是真的,但事实并非如此   绝对要求。虽然它是   通常情况是:   x.clone()。equals(x)将为true,这个   不是绝对的要求。通过   约定,返回的对象应该   通过调用super.clone获得。如果   一个类及其所有超类   (除了Object)遵守这个约定,   

会是这样的      

x.clone()。getClass()== x.getClass()。

     

按照惯例,返回的对象   这种方法应该是独立的   这个对象(正在被克隆)。

     

要实现这种独立性,它   可能需要修改一个或多个   返回的对象的字段   在返回它之前超级克隆。   通常,这意味着复制任何   构成的可变对象   内部的“深层结构”   被克隆的对象并取代了   用这些对象引用   对副本的引用。如果是一个班级   仅包含原始字段或   那么引用不可变对象   通常情况下没有字段   在super.clone返回的对象中   需要修改。

意味着当你在对象中有一个子对象时,你不应该只是克隆/复制它的引用,而是该对象的内部结构(为了创建它的新实例),如果每个对象都有 clean clone()方法你可以像父对象一样克隆它,否则你将不得不创建它的新实例并逐个复制它的内部premitive字段。