《java核心技术》第9版卷一168页有这句话:
Manager类中的方法只能访问Manager对象中的hireDay域,而不能访问其他Employee对象中的这个域。
(注:Manager是Employee的子类,hireDay域是Employee的protected域)然后,我试了一下,发现不是这样。
class P{
protected int a;
public P(){}
public P(int a){
this.a = a;
}
}class C extends P{
public int b;
public C(){}
public C(int a,int b){
super(a);
this.b = b;
}
public void fun(){
a++;
P p = new P(10);
System.out.println("C.a= " + a);
System.out.println("P.a= " + p.a);
}
}public class Demo {
public static void main(String[] args) {
C c = new C(100,200);
c.fun();
}
}是不是这本书出错了?

解决方案 »

  1.   

    你这么写确实是不可以的。
    书中有个词你要注意下“对象”,这个对象只是是与你子类有继承关系的对象,而不是有引用关系的对象。
    如果像你那么写 P p = new P(10);的p与当前C类的关系是从属,即常说的has-a,p与C类的对象并没有继承关系,自然也就没有访问权限了。
    正确的写法是什么,你应该使用this或者super,即你打印那个代码改成 System.out.println(this.a);//或者super.a。
    最后补充一点,如果你把P中的a属性声明为static的,那么你报错那里同样是可以通过P.a访问到的,因为他们的类也是有继承关系的,类变量自然有访问权限。
      

  2.   

    p对象与当前C类的对象的关系是从属,即常说的has-a……前面说的不严谨,补充下。
      

  3.   

    可以访问的!protected就是为子类准备的,为什么不能访问?
      

  4.   

    针对于这里的不能访问是指父子类不在同一个包内时,子类是不能访问父类以及其它子类中继承来的protected变量。楼主可以将P类移动到另一个包中,并实现继承。此时不能通过实例化父类访问父类的Protected变量。