了解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

回到顶部