我们知道,变量声明为protected,那么它对子类应该是可见的,但在《core java》中看到,“如果超类Employee把hireday声明为protected,那么Manager中的方法就可以访问它,不过Manager类的方法只能够访问Manager对象的hireday字段,而不能访问其他对象的这个字段.”不理解为什么Manager类的方法不能访问一般的Employee的hireday字段?hireday是protected的,那么应该对子类Manager是透明的才对啊。谢谢解答。还有clone那块,“clone方法在Object类中的声明是protected的,这样你的代码无法简单的地调用anObject.clone()”。为什么呢?既然anObject是Object类的子类的对象,子类是可以访问父类的受保护方法的,那么为什么不行呢?
如果子类中想调用这个方法,那么就要覆盖这个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();
//正确,其他包中的子类可见
}
这下应该明白了吧 :)
其实,本包中重写了portected方法,那么那个方法也就是子类自己的了,这也正是多态性的一种体现。
字段既然是protected的,那别的对象就不能访问本对象的这个字段了,只能有本对象的方法去调用,如果是public的被的类方法才可以访问
第二个问题,没理解意思,呵呵
不管方法、字段,在可见性上都没有区别的啊 :)