我仔细阅读了有效的Java(Joshua Bloch),我在克隆中找到了以下句子:
如果您设计了一个继承类,请注意,如果您选择不提供行为良好的受保护克隆方法,则子类将无法实现Cloneable。
我有点困惑,因为在我的小测试中:
public class Cloning {
public static void main(String[] args) throws CloneNotSupportedException {
Woman woman1 = new Woman("Marie Curie-Sklodowska", 33, "Physics");
Woman woman2 = (Woman) woman1.clone();
}
static abstract class Person {
protected String name;
protected int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
static class Woman extends Person implements Cloneable {
private String field;
Woman(String name, int age, String field) {
super(name, age);
this.field = field;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
}
我没有收到任何错误。我想,我不理解这句话。有人可以解释,作者的想法是什么?
答案 0 :(得分:0)
如果您设计了一个继承类,请注意,如果您选择不提供行为良好的受保护
clone()
方法,则子类将无法实现Cloneable
。
他错了。他们能。考虑:
public class A
{
private int fieldA;
}
public class B extends A implements Cloneable
{
public B clone() throws CloneNotSupportedException
{
return (B)super.clone();
}
}
B.clone
()将返回调用它的B
实例的完美副本,包括A.fieldA
。反例拒绝:QED
[我知道这个clone()
不应该被声明为抛出CloneNotSupportedException
,但它会使演示变得更简单。]
这一切都很好奇,因为他刚才说过几句话:
一些程序员只需选择永不覆盖
clone()
方法
和
为继承而设计的类不应该实现它[
Cloneable
]
更令人感到好奇的是,上面的第一句话是整个部分的最后一句,并且完全没有任何论据或例子支持,除非整个部分旨在证明它,它没有#&# 39;吨。整个部分都很混乱,很难弄清楚所要求的内容。克隆并不像他所说的那样难以理解或实施。也不重要。在20年的Java中,我还没有在严肃的代码中使用它,或者所谓的复制构造函数'任