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
你的子类也不能(通常)。
Cloneable
和clone()
几乎已被弃用,所以无论如何都没关系。 但是,由于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? } }