了解Java的protected修饰符
我在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节。尤其是:
令C
为声明受保护成员的类。仅在C的子类S的主体内允许访问。
另外,如果Id表示实例字段或实例方法,则:
[…]
如果通过字段访问表达式E.Id(其中E是主表达式)或通过方法调用表达式E.Id(…)(其中E是主表达式)进行访问,则仅当且仅当允许访问时,如果E的类型是S或S的子类。
(强调我的。)
所以这段代码就可以了:
C c = new C();System.out.println(c.publicInt);
System.out.println(c.protectedInt);
以上是 了解Java的protected修饰符 的全部内容, 来源链接: utcz.com/qa/399930.html