覆盖受保护的方法,并尝试从超类中调用它

时间:2012-05-04 21:48:16

标签: java override extends

我的问题来自一个项目。因此,让我抽象出一些不相关的细节。

我有一个JAVA公共类A,它有两个受保护的静态方法,foo()和bar()。方法foo()在其体内调用bar()。

public class A{
  protected static foo(){
     ...
     bar()
     ...
  }
  protected static bar(){print("A.bar()");}

} 

现在我还有一个B级扩展A.在B中,我覆盖了bar()

class B extends A{
  @Overrides
  static protected bar(){ print("A.bar() extended");

}

最后,我从B

中的一个类调用foo()
class B extends A{
  ...
  public static main(){foo()} 
}

我无法理解两点 1.编译器(Eclipse)要求我删除@Override注释。为什么? 2.最后main()输出“A.bar()”,这意味着已解析的bar()目标是A类,但我打算覆盖bar()并使用A的foo()来调用修改后的bar( )。我怎样才能做到这一点?

你有什么看法?

2 个答案:

答案 0 :(得分:7)

  1. 您无法覆盖静态方法。
  2. 由于每个方法都是静态的,因此静态引用它们。您首先拨打A.foo(),然后拨打A.bar()。由于您没有实例,因此覆盖方法不起作用。
  3. 您需要从代码中删除所有static并在主网址中使用new B().foo()

    请考虑阅读此tutorial

答案 1 :(得分:6)

您不能覆盖静态方法,只能覆盖非静态实例方法。您试图在静态环境中使用继承,但这不会起作用。如果你真的需要继承(通常当你认为你做的时候,你真的没有),那么就让这些方法成为非静态的。