protected是在同包内的能访问吧

解决方案 »

  1.   

    b是A 的域而非B的,在编译时既确定了.应改为:
    class B extends A{
      private int b ;
      public static void main(String args[]){
         A a=new A();
         a.b=100;
      }
    }
      

  2.   

    这是因为b本身不是static的,而你要在static 的main方法中使用,肯定是不行的啦。即使是A类内部,在static的方法中也不能使用非static的成员变量。
    你把protected int  b=-128;改为static protected int b = -128;
      

  3.   

    to yuanmeng163(今天我有空) :
    楼主是new 了一个A啊,用A的实例a来访问的啊?
      

  4.   

    你好qingbt:
        有可能是你看的书写错了,还有可能是你理解错了。protected关键字修饰的变量只能在同一个包中互相访问,这一点是肯定的。若你想改你的程序,可以在下面文件中加入package p1;然后还要在环境变量中设置p1的路径,这样你就不会出错了。
      

  5.   

    to  fantasyfire(幻火):我知道,我的回答有问题吗?你想说什么?
      

  6.   

    你好javagang() :
        你的理解有问题,protected关键字修饰的变量,不是象你说的那样只能在同一个包中互相访问。只是在同一个包里,就如同public;而在别的包里只要是它的子类,也是可以访问到的,楼主出的错误,我刚才已经解释过了,是在static方法中不能访问非static的变量的问题。
      

  7.   

    to yuanmeng163(今天我有空)
    你好
    我的意思是说,楼主是用了一个A的实例来访问A中的变量,应该不是static的问题
    在一个static的方法中不能直接访问一个非static的变量或方法,但用一个实例来对它的变量变量进行访问应该没错吧:
    public class Try{
      int i = 0;
      public static void main(String[] argc){
        i = 2;//这样是不对的,因为i不是static的
        Try tr = new Try();
        tr.i = 2;//这样应该没错的吧?
      }
    }
      

  8.   

    楼上的,你说的上面的没错。虽然楼主是用了一个A的实例来访问A中的变量,但这是在A的子类B中进行的
      

  9.   

    Sorry,我刚才说的不太清楚。
    我总结一下吧:
    如果一个类(假定叫A)有个protected的成员变量(假定变量名为var),
    1。和A类处在同一个包的类可以访问到var,就像是public的一样;
    2。和A类不在同一个包的类(并且没有继承关系)对var没有访问权限;
    3。A的子类可以访问,但如果子类和A不在同一个包中的话,则不能用A类的对象访问,可以用子类的对象访问(this也算子类的对象);
    *:以上假定访问时都不是在静态方法中访问如果var又是static的,则在子类中即可用父类的对象也可用子类的对象访问var(即使是子类和A不在同一个包中).
      

  10.   

    首先谢谢各位!
    出现的错误是这样:b.java:5: b has protected access in p1.A
    可能的确是我理解错了,有的教材说protected可以在不同包的子类中能够访问,但是没有明确说是否访问实例变量。
    我的疑问和 fantasyfire一样,如果直接用b=100,必须是static。看来yuanmeng163所说“A的子类可以访问,但如果子类和A不在同一个包中的话,则不能用A类的对象访问,可以用子类的对象访问(this也算子类的对象)”有道理。