protected是保护那个包,一个家族的访问权,它的同一个包里的子类可以调用,其他包就不行,避免被别人继承而做clone()操作。

解决方案 »

  1.   

    谢谢回答,但我还是不理解任何类都是object的子类,那object中的clone()定义为protected有什么意义呢?
      

  2.   

    我的问题是Manager的对象调用toString时为什么返回的是Manager[name=....]
    而不是Employee[name....]? 我的理由是Manager中的toString()中用的是super
    这说明是调用的是父类方法那理所应该得到父类Employee的类名?是调用的父类的方法,但该方法到底应该怎么执行,取决于当前实例,不取决于代码写在哪里(父类还是子类),当前实例是子类,那结果就是子类的结果。
      

  3.   

    首先回答你的第2个问题:
    当你覆盖了超类的方法的时候那么在编译过程中程序一定是在完成构造函数之前就已经决定了什么是真正的方法,在你的程序中在对象建立之前他的方法就已经完成了,那么当对象调用toString方法时,当然就是现实自己(当前实例)的名字了。你也可以理解为你那个super.toString()就是一种简写吧。
    其次讨论你的第一个问题:
    Object.clone()方法定义为保护方式,因为子类也需要限制使用克隆,但是如果把它在Object中就定义为public,则子类根本不能够采取更严格的限制。
      

  4.   

    现在回答你的第一个问题。
    我们都知道一个新的类多数情况下都是通过 组合(combination) 方式完成的。
    举个例子吧:
    汽车(Car)类  那么Car的对象---BMW (宝马车)extends Car就有了自己的那些轮胎/车架/发动机,这些东东,这时,夏利 extends Car 也有了相应的基础东东,
    (我们都知道 Car extends Object)
    1。如果 Object.clone()----public  那么可以想象  只要 夏利 在他的定义内 调用 宝马的clone方法 那么它也能买BMW了,这不就出现了“盗版”!!
    2。如果 -----protected 那么 只有夏利 号称 是宝马公司的子公司(继承),或者合作伙伴(同一个包)才能生产宝马,否则 充其量 只能拿来看看但是不能生产。
    3。如果是----private 那么这下惨了,在clone()方式中我们不能调用 super.clone()来建立完成克隆,连BMW公司都破产了。