为什么 clone() 方法在 java.lang.Object 中受到保护?
clone()
在 中被定义为受保护的具体原因是什么?java.lang.Object
clone()
在 中被定义为受保护的具体原因是什么?java.lang.Object
克隆受到保护的事实是非常可疑的 - 就像该方法未在接口中声明的事实一样。clone
Cloneable
这使得该方法对于获取数据副本毫无用处,因为您不能说:
if(a instanceof Cloneable) {
copy = ((Cloneable) a).clone();
}
我认为现在的设计在很大程度上被认为是一个错误(引文如下)。我通常希望能够实现接口,但不一定使接口可克隆
(类似于使用)。如果没有反射,就无法做到这一点:Cloneable
Cloneable
Serializable
ISomething i = ...
if (i instanceof Cloneable) {
//DAMN! I Need to know about ISomethingImpl! Unless...
copy = (ISomething) i.getClass().getMethod("clone").invoke(i);
}
引用自Josh Bloch的 Effective Java:
“可克隆接口旨在作为对象的mixin接口,以宣传它们允许克隆。不幸的是,它未能达到这个目的...这是一种非常非典型的接口使用,而不是要模仿的...为了实现接口对类产生任何影响,它及其所有超类必须遵守相当复杂,不可执行且基本上未记录的协议。
可克隆接口只是一个标记,表示该类可以支持克隆。该方法受到保护,因为您不应该在对象上调用它,您可以(并且应该)将其重写为公共。
从太阳出发:
在类 Object 中,clone() 方法被声明为受保护。如果您所做的只是实现 Cloneable,则只有同一包的子类和成员才能在对象上调用 clone()。若要使任何包中的任何类能够访问 clone() 方法,必须重写它并将其声明为公共,如下所示。(重写某个方法时,可以使其不那么私密,但不能使其更加私密。在这里,Object 中的 protected clone() 方法被重写为公共方法。