这是因为 clone() 的典型实现如下所示:
public class MyClass implements Cloneable {
protected Object clone() {
MyClass cloned = (MyClass) super.clone();
// set additional clone properties here
}
}
通过这种方式,您可以从您的超类继承克隆行为。人们普遍认为 clone() 操作的结果将根据调用它的对象返回正确的实例类型。IE。this.getClass()
因此,如果一个类是 final 的,您不必担心调用 super.clone() 的子类并没有得到正确的对象类型。
public class A implements Cloneable {
public Object clone() {
return new A();
}
}
public class B extends A {
public Object clone() {
B b = (B)super.clone(); // <== will throw ClassCastException
}
}
但是,如果 A 是最终的,则没有人可以扩展它,因此使用构造函数是安全的。