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

cha*_*a89 6 java

我经历了这么多的网站这解释了有关使用Java访问说明如走的java文件,Java的访问说明,像许多其他计算器的问题在这里.

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

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

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

package com.One;

    public class ProVars {

    protected int i = 900;

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

    }
}
Run Code Online (Sandbox Code Playgroud)

任何解释都表示赞赏.

chr*_*her 10

你试图像使用它们一样使用它们public.他们不是public,他们是protected.

ProVars p = new ProVars();
p.foo(); // This will throw an error because foo() is not public.
Run Code Online (Sandbox Code Playgroud)

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

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

为什么这样做?

因为你inherited是班上的人.这意味着你已经拥有了它的所有方法和它的变量.现在,因为你的方法和变量是protected,它也意味着可以从中访问它subclass.尝试并声明它们private,看看会发生什么.

  • 感谢您的清晰解释。因此,我们可以访问子类中的受保护成员,但不能通过超类的对象访问它们。 (2认同)

SLa*_*aks 9

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

在里面AnotherClass,你可以访问new AnotherClass().i,但不是new ProVars().i.