【发布时间】:2013-05-08 12:53:12
【问题描述】:
我正在从另一个包中扩展一个类时,我发现某些东西没有编译,即使我认为它应该编译。
我有两个类,在不同的包中。在 com.foobar.a 包中:
package com.foobar.a;
public class A {
protected void foo1() {
System.out.println("foo1() was called!");
}
protected static void foo2() {
System.out.println("foo2() was called!");
}
}
在 com.foobar.b 包中:
package com.foobar.b;
import com.foobar.a.A;
public class B extends A {
public void bar() {
A obj = new A();
obj.foo1(); // This doesn't compile
A.foo2(); // This does compile
}
}
现在,根据这个:http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html 一个子类应该能够访问该方法,即使它在同一个包之外(我们看到该方法是静态的,它可以工作)。事实上,我正在 Eclipse 中编程,它给我的解决问题的建议是“将 'foo1()' 的可见性更改为受保护”,但它已经受到保护。
那么,这里到底发生了什么?在 oracle 规范中,它使用 Class、Package、Subclass 和 World 表示访问级别。应该将“Instance”添加到此列表中,如果是,规则是什么?
【问题讨论】:
-
如果您将尝试直接访问
foo1(),而不是将其用作obj.foo1(),那么它将起作用。