protected在本类,本包和继承该类的子类里是可访问的有以下代码:
package com.yuchujin.Super
public class Super{
 protected int i=0;
}//----------------------------两个不是同一个包package com.yuchujin.Sub
import com.yuchujin.Super;public class Sub
  extends Super{  public static void main(String[] args){
      Sub subObj =  new Sub();
      System.out.println(subObj.i); //因为main方法定义写在子类体里,所以可以创建子类对象并调用到超类的protected方法       Super superObj = new superObj();
      System.out.println(superObj .i); //ERROR!报错
  }
}
不知道为什么在子类体里的main方法中创建一个超类对象就不能调用protected方法了。 是不是因为对于超类的对象superObj来说子类体里就相当于他的其他类?

解决方案 »

  1.   

    是不是因为对于超类的对象superObj来说子类体里就相当于他的其他类?
    可以这样理解,同理下面的也不可以
    Super superObj = new Sub(); 
      

  2.   

     Super superObj = new superObj(); 
    这行什么意思?你的superObj()哪来的?没有这个类,应该是Super()吧
      

  3.   

    我试过了,System.out.println(subObj.i); 这是可以访问的,因为这个i是继承而来的,
    而System.out.println(superObj.i); 这个不行,因为不在同一个包中,
    报错i has protected access in com.yuchujin.Super
    综上所述:protected修饰符修饰的虽然是可以被同一个包中以及子类访问,但如果该子类与父类不在同一个包中,依然是不能访问父类中protected修饰的,子类能访问的前提是与父类在同一个包中
      

  4.   

    难道是在子类中子类对象能访问父类的protected对象,而子类中父类对象却不能访问父类的protected对象???
    等待高手解决。
      

  5.   


    Super superObj = new superObj(); 
    这行代码根本就不能编译通过!
      

  6.   


    Private成员 默认的成员 Protected成员 Public成员
    同一类中可见 是 是 是 是
    同一个包中对子类可见 否 是 是 是
    同一个包中对非子类可见 否 是 是 是
    不同包中对子类可见 否 否 是 是
    不同的包中对非子类可见 否 否 否 是
      

  7.   

    你没看到  我不就是不在同一个包中吗?Sub子类import父类的包而且  
      

  8.   


    您的说法错误你可以自己试下  
    父类写在一个包里子类写在另一个包   import这个父类,并且继承父类结果是可以调用父类的protected成员的
      

  9.   

    如果说连继承的子类都要在父类的包下那就失去了protected的意义。直接用default代替就可以
    而且在c++中   protected的定义就是在  本类和子类可访问   其他类是不能访问的
      

  10.   

    我已经说过了,我试过了,父类写在一个包里 子类写在另一个包  import这个父类,并且继承父类 结果是不可以调用父类的protected成员的,你例子中 
    Sub subObj =  new Sub(); 
          System.out.println(subObj.i); 
    这里访问的i不是父类中的i,是继承而来的子类中的i
      

  11.   

    如果父类和子类是在同一个包中,那么父类中的属性,无论是用protected修饰还是默认的,都可以被子类访问,但如果父类和子类在不同的包中,如果父类的属性用protected修饰,是可以被子类访问的,而如果父类的属性是默认的,那么不能被子类访问,这就是区别,另外,不要把c++的思想与java弄混了
      

  12.   

    没错,应该是因为父类的属性不仅是protected还是default!而default是不能被别的包访问的。lz试试在
    parent类中的protected属性加上Public试试!