//A.java
package modif;
public class A {
private int a1=1;
int a2=2;
protected int a3=3;
public int a4=4;
}
//第2个文件A11.java
package modif2;
import modif.A;
public class A11 extends A{
public static void main(String[] args){
A a=new A();
System.out.println(""+a.a3);//错误
}
public int m2(){
return this.a3;//正确
    
}
}
请高手帮忙解释一下正确和错误的地方,谢了!

解决方案 »

  1.   

    父类的protected部分,只有与父类在同一个包内的子类才能够访问。
      

  2.   

    那为什么m2()是正确的?
    如果把m2()中的this.a3改成 new A11().a3也是正确的.
      

  3.   

    protected:同一个类中,同一个包中,不同包中的子类
      

  4.   

    protected对象是被继承者所继承的,但是不能被package以外的任何对象访问的.
    所以this.a3能访问自身的a3,当想访问A类的实例的a3时无权限.
      

  5.   

    protected 变量应该是可以被子类访问(不管是否在同一个包中)
    终于在doc中找到答案啊.呵呵.但是只能通过子类进行访问.
      

  6.   

    就是说protected只依赖于"继承".
      

  7.   

    to :pdvv(我爱花猫) 你的比喻有意思,呵呵
      

  8.   

    用protected修饰的成员,可以在任何地方被它的继承
    也就是子类继承了父类的public ,protected成员、
    public int m2()
    {
      return this.a3 《 =====》  return a3;
      
    }
    注解:a3在父类中用protected修饰,那么他会被它的子类所继承。
    如果你在子类中生成了一个父类的实例,然后在引用它protected修饰的成员,这种情况和在其他类中引用父类的成员是一样的,是不可以访问的。
      

  9.   

    你可以参考我以前做过的讨论:
    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=210858这里应该是存在理解protected访问权限的问题。
    子类是继承了父类的protected的字段或者方法,但是子类只可以访问继承类的protected,而不能创建父类的对象访问protectedSystem.out.println(""+a.a3);//错误
    这条语句就是创建父类的对象,并且尝试通过父类对象访问protected的a3return this.a3;//正确
    这个语句就是访问子类继承来的protected的a3
      

  10.   

    java语言中有四种不同的限定词,提供了四种不同的访问权限。
    1) private 
      类中限定为private的成员,只能被这个类本身访问。
      如果一个类的构造方法声明为private,则其它类不能生成该类的一个实例。
    2) default
      类中不加任何访问权限限定的成员属于缺省的(default)访问状态,可以被这个类本身和同一个包中的类所访问。
    3) protected
      类中限定为protected的成员,可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问。
    4) public
      类中限定为public的成员,可以被所有的类访问。java中类的限定词的作用范围比较         同一个类 同一个包  不同包的子类  不同包非子类
    private      *
    default      *       *     
    protected    *       *           *
    public       *       *           *            *