我们知道,变量声明为protected,那么它对子类应该是可见的,但在《core java》中看到,“如果超类Employee把hireday声明为protected,那么Manager中的方法就可以访问它,不过Manager类的方法只能够访问Manager对象的hireday字段,而不能访问其他对象的这个字段.”不理解为什么Manager类的方法不能访问一般的Employee的hireday字段?hireday是protected的,那么应该对子类Manager是透明的才对啊。谢谢解答。还有clone那块,“clone方法在Object类中的声明是protected的,这样你的代码无法简单的地调用anObject.clone()”。为什么呢?既然anObject是Object类的子类的对象,子类是可以访问父类的受保护方法的,那么为什么不行呢?

解决方案 »

  1.   

    我觉得书上的意思是说,子类在类的内部可以使用超类的变量和方法,但是假若实例化一个对象anobject后,是不能使用anobject.clone()来调用的,也不能使用anobject.hireday来调用父类的hireday
      

  2.   

    这里可见的意思是子类中声明的“父类引用”可以调用这个父类的protected方法,但并不代表其子类中也可以任意调用这个方法。
    如果子类中想调用这个方法,那么就要覆盖这个protected方法,变成它自己的方法来调用。
    呼呼,正好复习一下,好久没回答这个问题了 ^_^
      

  3.   

    protected方法是对本包中和其他包的子类中可见的。
    举个例子:
    package one;
    class A{
    ...
    protected void pMethod(){...}
    ...
    }class B extends A{
    ...
    A a = new A();
    a.pMethod();
    //正确,因为本包且是子类中protected方法可见
    B b = new B();
    //b.pMethod(); 
    //错误,因为B类中并没用这个方法,它只是可以继承但你在B类中并没有继承这个方法
    //换句话说,子类可以继承pMethod()方法,但并不像public那样可以自动继承该方法。
    }package two;class C{
    ...
    A a = new A();
    //a.pMethod();
    //错误,在其他包中protected方法不可见
    }class D extends A{
    ...
    A a = new A();
    a.pMethod();
    //正确,其他包中的子类可见
    }
    这下应该明白了吧 :)
      

  4.   

    protected方法是对本包中,本包中和其他包的子类中可见的。上面那句容易误解。
    其实,本包中重写了portected方法,那么那个方法也就是子类自己的了,这也正是多态性的一种体现。
      

  5.   

    楼主问的是字段,而不是方法。
    字段既然是protected的,那别的对象就不能访问本对象的这个字段了,只能有本对象的方法去调用,如果是public的被的类方法才可以访问
    第二个问题,没理解意思,呵呵
      

  6.   

    第二个问题问的不就是protected方法的问题么?
    不管方法、字段,在可见性上都没有区别的啊 :)
      

  7.   

    clone()方法,就是用来拷贝对象的。但是Object类中定义的clone()方法并不知道你定义的子类中都有什么字段,当然无法拿过来就用。所以这个方法是protected的,意思就是如果你想用这个方法,那么自己重写吧,只有你知道你要拷贝什么字段,另外,要重写的话,记得继承Cloneable接口。