Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java实现Clonable_Java_Clone_Final_Cloneable - Fatal编程技术网

用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()。