从包外的子类访问受保护的变量

新手上路,请多包涵

我浏览了很多网站,这些网站解释了 java 中的访问说明符,例如 java 论文java 的访问说明符 以及 此处 的许多其他 stackoverflow 问题。

所有这些人都解释说受保护的成员可以被任何子类访问(也可以被包外的子类访问)并且可以被包级别的类访问。

在对受保护成员进行试验时,我发现我无法从包外的子类访问受保护成员。

检查下面的代码。具有受保护成员的公共类:

 package com.One;

    public class ProVars {

    protected int i = 900;

    protected void foo()
    {
        System.out.println("foo");
    }

}

不同包中的另一个公共类试图访问受保护的成员:

 package com.Two;

import com.One.ProVars;

public class AnotherClass extends ProVars {

    public static void main(String[] args) {
        ProVars p = new ProVars();
        System.out.println(p.i);//the field ProVars.i is not visible(Compilation Error)
                p.foo();//the method foo() from the type ProVars is not visible

    }
}

任何解释表示赞赏。

原文由 chaitanya89 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 431
2 个回答

您正试图像使用它们一样使用它们 public 。它们不是 public ,它们是 protected

例子

ProVars p = new ProVars();
p.foo(); // This will throw an error because foo() is not public.

子类使用 protected 方法或变量的正确用法是:

 public class MyClass extends ProVars
{
     public MyClass()
     {
           System.out.println(i); // I can access it like this.
           foo(); // And this.
     }
}

为什么这行得通?

因为你有 inherited 类。这意味着您已经获得了它的所有方法和变量。现在,因为您的方法和变量是 protected ,这也意味着可以从 subclass 访问它。尝试将它们声明为 private 看看会发生什么。

原文由 christopher 发布,翻译遵循 CC BY-SA 3.0 许可协议

即使在派生类中,您也只能从 至少属于您自己类型 的限定符访问受保护的字段。

AnotherClass 中,您可以访问 new AnotherClass().i ,但不能访问 --- new ProVars().i

原文由 SLaks 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题