//A.java
package pa;
public class A {    public A() {
    }
    public void show1(){
     System.out.println("A");
    }
    protected void show2(){
     System.out.println("a");
    }
}//B.java
package pb;
 class C extends pa.A {     C() {
    }
    public void show3(){
     System.out.println("C");
    }
    protected void show4(){
     System.out.println("c");
    }
    
    
}public class B {
public static void main(String [] args){
          C c=new C();
          c.show2();//error
          
    
    }
}
编译错误:show2() has protected access in pa.A
        为什么show2()不能c被访问呢,c是A的子类啊!请各位好心人帮忙

解决方案 »

  1.   

    虽然不在同一个包内,但是protected对不同包的子类是可见的啊,还是不太明白...
      

  2.   

    C中可见show2(),因为是不同包的子类
    但在另外一个类B中,就不可以看见show2()了,因为这个类B不是A的不同包子孙类,也不在一个包中。我觉得这个它就是这么规定的。否则那保护不是失去意义了吗? A本来只想去自己的子类C公开一个方法,结果因为B跟自己的子类C在一个包中,就间接地可以访问A,那A设置的保护,意义就不大了。如果真想访问,可以在C中覆盖show2,并用super.show2实现,达到让其他类间接访问A的目的。 
      

  3.   

    谢谢楼上的讲解,有点明白了。但是我在class B 后面加上  extends pa.A后,还是会出现上面的编译错误,怎么办
      

  4.   

    extends 默认会继承父类的public ,和默认权限 字段,如果在同一个包下面才会继承protected 字段