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

Tur*_*oes 37 java clone

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

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

Lau*_*eyn 52

实施clone()Object检查实际的类实现Cloneable,并创建实际的类的实例.

因此,如果您想使您的类可以克隆,您必须实现Cloneable并向后传播super.clone()您的类的结果.另一个负担是,即使您知道它不会发生(因为您的类实现),调用super.clone()可以抛出CloneNotSupportedException您必须捕获的内容Cloneable.

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

  • 我一直在读我应该避免使用 clone(),但我想至少了解它是如何工作的......这让我发疯 (2认同)
  • @TurtleToes:如果所有祖先类都使用Super.Clone实现克隆,那么派生类应该使用使用super.clone的版本覆盖clone,否则只需让派生类继承现有的clone方法.如果任何祖先类使用复制构造函数实现它,那么*all*派生类也必须使用复制构造函数; 在这种情况下,使用继承的克隆方法不是一个选项. (2认同)
  • 为什么这是公认的答案?它没有解释任何原因。它只是重复你必须做的事情,而不是原因。我认为 Cloneable 是 100% 垃圾,只需编写一个 copy() 方法来复制我的对象... (2认同)

JB *_*zet 6

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


Ass*_*ato 5

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

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

有关克隆此链接的更多信息