假设我们有一个包“p1”:
package p1;
public class A {
protected void method() { }
}
...我们还有一个包“p2”:
package p2;
import p1.A;
public class B extends A { }
class Tester {
static void run() {
new B().method(); //compile-time error
}
}
现在,如果我们尝试编译整个示例,我们将停留在带有编译时错误的标记行:编译器在B中看不到目标方法。为什么会这样?
答案 0 :(得分:2)
由于A.method()
的{{3}}为protected
和B extends A
,因此存在protected B.method()
但请注意,对于protected method()
而言类B
,method()
类似于类B
的“私有实体”,只能从任何对象引用“公共实体”,因此new B().method()
会产生编译时错误。
要使代码正常工作,您可以更改访问修饰符。
package p2;
import p1.A;
public class B extends A {
@Override
public void method() {
super.method();
}
}
答案 1 :(得分:0)
受保护的方法在扩展基础(甚至在层次结构中)或相同包中的所有类中都可见。您正尝试在其他包和非扩展类中使用方法。
答案 2 :(得分:0)
超类的受保护方法在子类中变为私有。 如果你真的想从任何地方调用它,那么把它设为公共或者,如果你仍然希望保护你的超类方法,在子类中调用(私有的,继承的)方法的子公共方法,在子类中的东西,如: / p>
public class B extends A {
public void callTheMethod(){
method();
}
}
,测试类可以通过
轻松调用class Tester {
static void run() {
new B().callTheMethod(); //works well
}
}