问题

java.lang.Object中160604939被定义为受保护的具体原因是什么?


#1 热门回答(95 赞)

克隆被保护的事实是非常可疑的 - 因为事实是554413896方法没有在Cloneable接口中声明。

它使得该方法对于获取数据副本毫无用处,因为你不能说

if(a instanceof Cloneable) {
    copy = ((Cloneable) a).clone();
}

我认为5844002095的设计现在在很大程度上被视为错误(下面引用)。我通常希望能够实现interfaceCloneable但不一定要生成interfaceCloneable(类似于使用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的有效Java的引用:"Cloneable接口旨在作为一个mixin接口,用于宣传他们允许克隆的对象。不幸的是,它无法满足这一目的......这是一个非常非典型的接口使用,而不是一个被模拟...为了实现接口对类产生任何影响,它和它的所有超类必须服从一个相当复杂,不可执行且基本上没有文档的协议"


#2 热门回答(24 赞)

Clonable接口只是表示该类可以支持克隆的标记。该方法受到保护,因为你不应该在对象上调用它,你可以(并且应该)将其覆盖为public。

来自Sun:

在Object类中,clone()方法被声明为protected。如果你所做的只是实现Cloneable,那么只有子类和同一个包的成员才能在对象上调用clone()。要使任何包中的任何类能够访问clone()方法,你必须覆盖它并将其声明为public,如下所示。 (当你重写方法时,可以使其不那么私密,但不会更私密。这里,Object中的protected clone()方法被重写为公共方法。)


#3 热门回答(7 赞)

clone受保护,因为它应该被覆盖,以便它特定于当前类。虽然可以创建一个可以克隆任何对象的publicclone方法,但这不会像专门为需要它的类编写的方法那样好。


原文链接