首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java : clone()操作调用super.clone()

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

Stack Overflow用户
提问于 2011-03-25 18:00:22
回答 3查看 33.4K关注 0票数 46

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

如果这让人困惑,我很抱歉;我有时会把自己搞糊涂。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-25 18:07:07

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

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

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

票数 60
EN

Stack Overflow用户

发布于 2011-03-25 18:07:01

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

票数 6
EN

Stack Overflow用户

发布于 2011-03-25 18:16:07

考虑这一点:你有一个继承类的链。每一个都可能(也可能没有)有自己的变量。与复制引用的等于运算符(==)相反,克隆所做的是具有新引用的对象的克隆副本。在上面的例子中,你想克隆链中的最后一个对象。由于最后一个对象是由它的超类构造的,其中每个超类都可能有不同的克隆方法实现,因此调用clone的超类实现以在克隆自己的对象之前首先接收克隆的父对象是很有意义的。

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

有关克隆的更多信息,请访问this link

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5430944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档