当我在课堂上实施Cloneable
时,请说班级AA
,
class AA
是可复制的 - 我可以在它的对象上调用clone()
没有获得CloneNotSupportedException
。我能做到这一点
没有覆盖clone()
(尽管建议将对象与其克隆保持独立)。
当一个类是Cloneable
时,它的后代也是如此。
在以下代码中,
class ZZ {protected void mm(){System.out.println("+++");}}
class AA extends ZZ implements Cloneable {
// ...
protected Object clone () throws CloneNotSupportedException {return super.clone();}
AA cloneMe() throws CloneNotSupportedException { return (AA)clone(); }
}
class C extends AA {
public static void main(String[] args) throws CloneNotSupportedException {
C c = new C();
AA a = new AA();
AA a22 = (AA)(c.clone());
AA a3 = a.cloneMe();
C c2 = (C)c.clone();
AA a21 = (AA)a.clone();
a.mm();
}
}
我收到了检查错误
clone() has protected access in Object
到
行 AA a21 = (AA)a.clone();
当我在clone()
中评论AA
的实施时,即
// protected Object clone () throws CloneNotSupportedException {return super.clone();}
由于AA
是可克隆的,我应该能够克隆它的实例而不在clone()
本身中实现AA
。 AA
从clone()
继承Object
。
那么 - 怎么会出现这个错误?
TIA。
// =======================================
编辑:
我遇到与上面代码相同的问题,但类ZZ
除外,它是以下代码:
class AA implements Cloneable {
// ...
// protected Object clone () throws CloneNotSupportedException {return super.clone();}
AA cloneMe() throws CloneNotSupportedException { return (AA)clone(); }
}
class C extends AA {
public static void main(String[] args) throws CloneNotSupportedException {
C c = new C();
AA a = new AA();
AA a22 = (AA)(c.clone());
AA a3 = a.cloneMe();
C c2 = (C)c.clone();
AA a21 = (AA)a.clone();
}
}
类ZZ
用于显示"孙子"的protected
方法的调用。通过以类似的方式调用clone()
,不会给出与错误相同的错误。
// ============================================= ==
修改-2:
super.clone() operation not works in Derived Class中的答案说
"Clone is one of the early designs in java and it has flaws".
这似乎是唯一的解释。正在寻找进一步的验证。
我之前和没有成功地研究过这个问题 - 除了他们在Java文档中的解释之外,还有更多关于本机方法的内容。仍然 - clone()
的内部是任何更多 -
如何实施,如何克隆成员等以及它是如何管理"这个不寻常的访问权限?并根据情况??