一尘不染

了解Java的protected修饰符

java

我在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一样)访问,并且只能由其在另一个程序包中的类的子类访问。

这里发生了什么?


阅读 368

收藏
2020-03-01

共1个答案

一尘不染

你误解了的含义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);
2020-03-01