Java clone()方法

我读过J.Bloch的Effective Java,这里写道:

如果您设计了一个inheritance类,请注意,如果您选择不提供行为良好的受保护克隆方法,则子类将无法实现Cloneable。

我有A级:

public class A{} 

而B类延伸到A类:

 public class B extends A implements Cloneable { } 

那么在这种情况下我不能覆盖clone()方法? 如果是,请解释原因。

在您的情况下,您可以覆盖clone()

 public class A { } public class B extends A implements Cloneable { @Override public B clone() throws CloneNotSupportedException { return (B) super.clone(); } } 

并且仍然有一个有效的克隆机制 – 因此,当你声明implements Cloneable时,你说的是实话。

但是,打破这一承诺所需要的只是给A一个private变量。

 public class A { private int a; } 

现在你的承诺被打破 – 除非A实现clone ,在这种情况下你可以使用super.clone()

 public class A { private int a; @Override public A clone() throws CloneNotSupportedException { A newA = (A) super.clone(); newA.a = a; return newA; } } public class B extends A implements Cloneable { private int b; @Override public B clone() throws CloneNotSupportedException { B newB = (B) super.clone(); newB.b = b; return newB; } } 

基本上 – 正如Joshua Bloch所说 – 如果你没有实现clone你的子类也不能(通常)。

Cloneableclone()几乎已被弃用,所以无论如何都没关系。 但是,由于clone()总是应该调用super.clone() ,如果超类实现错误,子类也无法修复它。

它与无法覆盖clone()无关,它只是不会导致正确的实现。

当然你可以实现B.clone()

J. Bloch提到的问题是(IIRC),如果没有一个好的A.clone()方法,A中的私有字段就无法在B中正确克隆。简单示例:

 public class A { private String myText; public A (String myText) { this.myText = myText; } public String getExtendedText() { return "Hello something " + myText; } } public class B extends A implements Cloneable { private int someValue; // getter/setter public clone() { // how can you now provide a good clone with A.myText being cloned? } }