繁体   English   中英

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

[英]Java : clone() operation calling super.clone()

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM