用Java实现Clonable
在哪些情况下,我应该使用这种方式:用Java实现Clonable,java,clone,final,cloneable,Java,Clone,Final,Cloneable,在哪些情况下,我应该使用这种方式: public A clone() throws CloneNotSupportedException { A clone = (A)super.clone(); clone.x= this.x; return clone; } 在哪些情况下我应该这样做: public ShiftedStack clone() throws CloneNotSupportedException { return new A(this.x); }
public A clone() throws CloneNotSupportedException {
A clone = (A)super.clone();
clone.x= this.x;
return clone;
}
在哪些情况下我应该这样做:
public ShiftedStack clone() throws CloneNotSupportedException {
return new A(this.x);
}
如果x
是最终结果,我想使用第一种方法,我该怎么办
关于第一种方法,我的理解是这样的:我们克隆了超类并向上转换它,导致一些成员未初始化。在此之后,初始化这些成员。我的理解正确吗
谢谢。两件事:
1) 在第一种形式中,不需要浅层复制数据成员(clone.x=this.x)。Object.clone()为您执行此操作
2) 使用第二种形式时要小心:它总是创建具体类型A的实例,因此如果用B扩展A,那么B.clone()将无法再使用其超类的clone方法
--编辑--
关于您的问题,如果在类X的层次结构上正确实现了方法clone(),那么在类X的实现中调用super.clone()将返回类型为X的实例。从对象继承的默认clone()是一个“神奇的方法”,因为它创建了调用它的具体类的实例。它还执行所有数据成员的浅拷贝。通常,在clone()的实现中,您会执行一些深度复制,以避免源和克隆之间共享可变对象的引用。第一种方法不起作用。无法向上投射父类的克隆。它将是父类的一个实例
A clone = (A)super.clone(); // can't do this
cloneable()
被认为是有害的。可能对肝脏和幼儿造成损害。避免,这不是真的。从Object#clone()
,的文档中,按照惯例,应该通过调用super.clone来获取返回的对象。如果一个类及其所有超类(对象除外)都遵守此约定,则x.clone().getClass()==x.getClass()。