了解java的受保护的修饰符

我在package1中有一个名为A的类,而在package2中有一个名为C的类。 C类扩展了A类。

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的含义。 您可以访问受保护的成员宣布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);
    

    由于C继承了A ,因此C可以直接使用下面的Aprotected变量

    public class C extends A{
    
        public void go(){
    
           System.out.println(protectedInt);
    
        }
    }
    

    根据你的代码,你正在创建一个A的实例并通过该实例访问protected变量,这违反了Java的规则 - 一个受保护的变量在包之外是不可见的


     public void go(){
            //remember the import statement
            A a = new A();
            System.out.println(a.publicInt);
            System.out.println(a.protectedInt);
    
        }
    

    当你在做A a = new A();a.protectedInt你试图访问A的保护成员是非法的,根据Java标准

    相反,您可以直接执行this.protectedInt

    链接地址: http://www.djcxy.com/p/24113.html

    上一篇: Understanding java's protected modifier

    下一篇: Access protected member