【发布时间】:2017-11-13 22:41:43
【问题描述】:
我正在仔细阅读 Effective 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();
}
}
}
我没有收到任何错误。我想,我没有正确理解这句话。有人可以解释一下作者的想法吗?
【问题讨论】:
-
覆盖
Person.clone()并使其明确抛出CloneNotSupportedException。然后就不行了。 -
@AndyTurner 这听起来更像是选择提供一个行为不端的
clone方法。 -
@AndyTurner 这个问题似乎是重复的,但我根本没有得到答案。据我所知,
clone()可以很好地处理超类中的私有字段。 -
嗯,我正在阅读关于同一主题的帖子,但我也不清楚接受的答案。它指出,制作私有字段“违背了承诺”,但我已经尝试过私有字段 - 它没有任何区别。克隆的对象是相同的。所以我的问题可能是克隆,但原来的不包含令人满意的答案。
-
我重新提出这个问题,因为我不相信duplicate 得到了满意的回答。
标签: java cloning effective-java