[英]why protected clone() method is not accessible using inheritance in same package
[英]Java: why class designed for inheritance should contain protected clone method?
我正在仔細閱讀《有效的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();
}
}
}
我沒有任何錯誤。 我認為,我對這句話的理解不正確。 有人可以解釋一下作者的想法嗎?
如果您設計一個用於繼承的類,請注意,如果您選擇不提供行為良好的受保護的
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
]
更奇怪的是,以上第一句是整節中的最后一句,並且完全沒有論點或示例的支持,除非整節旨在證明這一點,否則就不會。 整個部分都如此混亂,以至於很難准確地確定所要求的內容。 克隆並不像他所理解的那樣難於理解或實施。 也不重要。 在20年來的Java中,我還沒有在嚴肅的代碼中使用過它,也沒有在所謂的“復制構造函數”中使用過它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.