Java:clone()操作调用super.clone()

时间:2011-03-25 10:00:22

标签: java clone

我并不完全理解在类的clone()方法中返回super.clone()的想法。首先,与它返回一个包含LESS数据而不是请求的超类的对象有关,因为超类“不是”子类,而是子类“是”超类。如果有一个很长的子类链,每个子类调用super.clone(),为什么不会导致它最终在链的根处调用Object.clone(),这不是任何子类? / p>

对不起,如果那令人困惑;我有时会迷惑自己

3 个答案:

答案 0 :(得分:51)

clone()Object的实现检查实际的类是否实现Cloneable,并创建该实际类的实例。

因此,如果您想让您的课程克隆,您必须向您的班级实施Cloneable向下转播 super.clone()的结果。另一个负担是,对super.clone()的调用可以抛出你必须捕获的CloneNotSupportedException,即使你知道它不会发生(因为你的类实现了Cloneable)。

Cloneable类上的clone接口和Object方法是面向对象设计出错的明显例子。

答案 1 :(得分:5)

考虑一下:你有一系列继承类。每个人都可以(或可能不)拥有自己的变量。与复制引用的equals运算符(==)相反,克隆的作用是带有新引用的对象的克隆副本。 对于上面的示例,您希望克隆链中的最后一个对象。 由于最后一个对象是由它的超类构成的,每个对象可能有不同的克隆方法实现,因此在克隆自己的对象之前,调用clone的超类实现首先接收克隆的父对象是很有意义的。

通常与克隆相关的另一个术语是浅层克隆和深度克隆。 浅层克隆是指创建对象的精确副本,而深度克隆则创建对象的副本以及原始对象引用的任何子对象。

有关克隆this link

的更多信息

答案 2 :(得分:4)

更仔细地阅读javadoc of Object.clone():它返回对象的副本。该副本是与调用克隆的对象相同的类的另一个实例。即foo.clone().getClass() == foo.getClass()