在Java中实现Cloneable

时间:2010-04-25 22:42:39

标签: 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);
}

如果x是最终版并且我想使用第一种方式,我该怎么办?

关于第一种方式,我理解为这样:我们克隆超级类并上传它,导致一些成员未初始化。在此之后初始化这些成员。我的理解是否正确?

谢谢。

2 个答案:

答案 0 :(得分:4)

两件事:

1)在第一种形式中,不需要浅拷贝数据成员(clone.x = this.x)。 Object.clone()为你做到了。

2)使用第二种形式时要小心:它总是创建一个具体类型A的实例,因此如果你用B扩展A,那么B.clone()就不能再使用它的超类'clone方法了。

- 编辑 -

关于你的问题,如果方法clone()在类X的层次结构中正确实现,那么在类X的实现中调用super.clone()将返回类型 X 的实例。从Object继承的默认clone()是一种“魔术方法”,因为它创建了一个具体类的实例。它还执行所有数据成员的浅表副本。通常,在clone()的实现中,您执行一些深度复制,以避免源和克隆之间的可变对象的共享引用。

答案 1 :(得分:-2)

第一种方法不起作用。您不能upcast父类的克隆。它将是父类的一个实例。

A clone = (A)super.clone();   // can't do this