我在package1中有一个名为A的类,在package2中有一个称为C的类。C类扩展了A类。
有一个实例变量,其声明如下:
protected int protectedInt = 1;
这是A类的代码
package package1; public class A { public int publicInt = 1; private int privateInt = 1; int defaultInt = 1; protected int protectedInt = 1; }
这是C类的代码:
package package2; import package1.A; public class C extends A{ public void go(){ //remember the import statement A a = new A(); System.out.println(a.publicInt); System.out.println(a.protectedInt); } }
Eclipse在C.go()的最后一行下划线,并说“ A.protectedInt”不可见。似乎这与oracle文档中给出的“ protected”关键字的定义相冲突。
protected修饰符指定成员只能在其自己的程序包中(与package-private一样)访问,并且只能由其在另一个程序包中的类的子类访问。
这里发生了什么?
你误解了的含义protected。你可以访问A从中声明的受保护成员C,但只能访问的实例C或的子类C。有关受保护访问的详细信息,请参见JLS的6.6.2节。尤其是:
protected
令C为声明受保护成员的类。仅在C的子类S的主体内允许访问。
C
另外,如果Id表示实例字段或实例方法,则:
[…]
如果通过字段访问表达式E.Id(其中E是主表达式)或通过方法调用表达式E.Id(…)(其中E是主表达式)进行访问,则仅当且仅当允许访问时,如果E的类型是S或S的子类。
(强调我的。)
所以这段代码就可以了:
C c = new C(); System.out.println(c.publicInt); System.out.println(c.protectedInt);