在Java中重写方法可见性

时间:2013-09-25 07:18:19

标签: java inheritance override visibility protected

假设我们有一个包“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中看不到目标方法。为什么会这样?

3 个答案:

答案 0 :(得分:2)

由于A.method()的{​​{3}}为protectedB extends A,因此存在protected B.method()但请注意,对于protected method()而言类Bmethod()类似于类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
    }
}