日期:2014-05-20  浏览次数:20762 次

Object中的clone为什么是protected,而不是public?
Object中的clone
protected   native   Object   clone()   throws   CloneNotSupportedException;

我知道:
1.自己的类要用clone则必须覆盖Object.clone(),或深拷贝,或浅拷贝
且实现Cloneable接口,以作为标记
2.protected的作用域为本包和子类

请解释我不知道的:
Object中的clone为什么是protected,而不是public?
请明确解释protected在这里所起的作用

------解决方案--------------------
之所以把clone方法定义为protected,是因为若把clone方法定义为public时,失去了安全机制.这样的clone方法会被子类继承,而不管它对于子类有没有意义.比如,我们已经为Employee类定义了clone方法,而其他人可能会去克隆它的子类Manager对象.Employee克隆方法能完成这件事吗?这取决于Manager类中的字段类型.如果Manager的实例字段是基本类型,不会发生什么问题.但通常情况下,一需要检查你所扩展的任何类的clone方法.

以上引自core java 第六版 209页
可我还是不理解为什么把clone定义为protected,谁能解释吗?
------解决方案--------------------
protected 的问题

protected方法被子类继承后,子类A如果和父类不在同一包里而且又没有复写该方法,则该方法对子类所在包的其他类的可见性变为private,如果再有子类B继承A,该方法还是可以被B继承

如:
class MyObject {}

public class Test
public static void main(String[] args)
MyObject obj = new MyObject();
obj.clone(); // Compile error.
}
}