Java:super.clone()方法和继承
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java:super.clone()方法和继承,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2345字,纯文字阅读大概需要4分钟。
内容图文
![Java:super.clone()方法和继承](/upload/InfoBanner/zyjiaocheng/702/e83cefed46e7475bab5e7dda6f97b5cd.jpg)
我有一个关于Java中clone()方法的快速问题,在继承方面用作super.clone() – 我在父类中从按钮一直调用clone()方法.
clone()方法应该返回这个对象的副本,但是如果我在继承heirachy中有三个类并且调用super.clone()三次,为什么不继承heirachy中的最高类,就在类下面对象,获取该类返回的副本?
假设我们有三个类:A,B和C,其中A – > B – > C(继承= – >)
然后在类C中调用super.clone(),调用B中的clone()调用super.clone(),在A中调用clone()调用super.clone()’这次调用Object.clone()’.为什么它不是从Object.clone()返回的类A的this对象的副本?这听起来很合乎逻辑.
解决方法:
听起来这里至少有两个问题在起作用:
>听起来你对clone()通常如何实现感到困惑.
>听起来你认为克隆是一个好主意(与使用复制构造函数,工厂或它们的等价物相比).
这是一个克隆方法的an example of an implementation:
@Override
public Object clone() throws CloneNotSupportedException {
//get initial bit-by-bit copy, which handles all immutable fields
Fruit result = (Fruit)super.clone();
//mutable fields need to be made independent of this object, for reasons
//similar to those for defensive copies - to prevent unwanted access to
//this object's internal state
result.fBestBeforeDate = new Date( this.fBestBeforeDate.getTime() );
return result;
}
请注意,super.clone()的结果会立即转换为Fruit.这允许继承方法然后修改Fruit特定的成员数据(在本例中为fBestBeforeDate).
因此,调用子clone()方法虽然它将调用父类的克隆,但也会对新制作的副本添加自己的特定修改.在这种情况下,出来的将是一个水果,而不是一个对象.
现在,更重要的是,克隆是一个坏主意.复制构造函数和工厂提供了更直观,易于维护的替代方案.尝试阅读我附加到示例的Java Practices链接上的标题:总结了一些问题. Josh Bloch也有a much longer discussion:绝对应该避免克隆.以下是关于他认为克隆是一个问题的原因的优秀摘要段落:
Object’s clone method is very tricky. It’s based on field copies, and
it’s “extra-linguistic.” It creates an object without calling a
constructor. There are no guarantees that it preserves the invariants
established by the constructors. There have been lots of bugs over the
years, both in and outside Sun, stemming from the fact that if you
just call super.clone repeatedly up the chain until you have cloned an
object, you have a shallow copy of the object. The clone generally
shares state with the object being cloned. If that state is mutable,
you don’t have two independent objects. If you modify one, the other
changes as well. And all of a sudden, you get random behavior.
内容总结
以上是互联网集市为您收集整理的Java:super.clone()方法和继承全部内容,希望文章能够帮你解决Java:super.clone()方法和继承所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。