第一个包package1中我建了个父类A,其中有一个protected修饰的属性b. 然后在第二个包package2中建了一个类B继承了A. 这个时候我用父类引用子类对象时,也就是A x = new B();时,对象属性x.b却访问不到. 但是直接用子类的引用实现子类对象时,即B x = new B();x.b是可以访问的. 而protected是只要是子类都可以访问的,为什么第一种方法不可以访问?还有到底A x = new B();的意思是什么? 请高手解答,小弟很迷惑

解决方案 »

  1.   

    我认为应该是这样的,protected是只要是子类都可以访问的,但是A x = new B();并没有实例化A的一个子类,而只是创建了一个A的对象,实现了B。所以x即没有成为一个A的子类的对象也没有实现A这个父类,所以无法使用protected定义的变量。回答得不一定准确,请高手指正。
      

  2.   

    可以调用的
    你只要在A类中变量前加个static 就可以拉
      

  3.   

    看一下这个
    http://blog.qingdaonews.com/v/9222/archives/2007/138988.html另外protected修饰的具有包访问权限,你的两个类不在同一个包中,所以不能被访问到
      

  4.   

    在A类中变量前加个static可以访问,是因为static静态变量不用new就可以访问
      

  5.   

    这些都是编译时进行的静态检查.
    x定义为A类型,那么编译时候就认为x是A类型的(x是一个存放类A的对象地址的引用型变量),跟x的实际类型没有关系.
    另外A类型只能知道谁是其超类,但并不能知道谁是其子类.
    所以在package2的B类型中x去调用protected的b就相当于一个去调用一个默认权限的b,
    因为不在一个包内,所以自然无法调用.
    而将x定义为B类型,x调用b时,编译器会检查x时候在B类中,或者在A类中
    结果是确实在,所以可以调用.至于static,如果b是static的,那么x.b是相当于A.b,在B中访问protected的A.b,理所当然
      

  6.   

    protected 是同一包内可见和子类中可见。对 x.b 操作来说, 如果 A x = new B(); 放到到A所在那个包中,就可以访问 x.b。在包外是不可见的,因为此时你操作的是对象是A,而不是B的一个实例。
      

  7.   

    A a = new A();
    System.out.println(a.a);replaced with a, error still; but if put it back to the superclass A's packet, it's done. in a word, 'protected' is the packet-decorater