当我发现一些没有编译的东西时,我正在从另一个包扩展一个类,即使我认为它应该编译。
我有两个班,在不同的包中。在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”,如果是,那么规则是哪个?
答案 0 :(得分:3)
如果要在子类中访问此方法,可以像这样使用它:
public void bar() {
this.foo1();
}
创建对象并尝试访问受保护的方法与访问超类受保护的方法不同。
答案 1 :(得分:0)
this.foo1();
可以使用obj.foo1();
。在obj.foo1();
课程中看不到B
。唯一foo1()
可见是继承的,实际上是this.foo1()
。这里有什么问题是你正在创建一个A
的对象并试图调用它的foo1()
。这是预期的行为,protected
意味着继承的类和相同的包类可以看到方法。