【发布时间】:2013-12-22 16:29:51
【问题描述】:
我浏览了很多网站,这些网站解释了 Java 中的访问说明符,例如 java papers、java's access specifiers,以及许多其他 stackoverflow 问题,例如 here。
所有这些人都解释说受保护的成员可以被任何子类访问(也可以被包外的子类访问)并且可以被包级类访问。
在对受保护成员进行试验时,我发现我无法从包外的子类访问受保护成员。
检查下面的代码。具有受保护成员的公共类:
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
}
}
感谢任何解释。
【问题讨论】:
-
在我看来,真正的解释是:继承类中的静态方法(在 JAVA 中),看不到受保护的字段/方法...,即使它们管理父类的实例。这是(从我的角度来看)一个悲伤的消息。在其他语言中,这可以执行(.NET)。这样,在 JAVA 中,在哪个类中编写静态方法并不重要……您将无法访问受保护的字段/方法……(例如:对象克隆、对象复制等)
标签: java