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

zel*_*ell 2 java extends overriding

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

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

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

} 
Run Code Online (Sandbox Code Playgroud)

现在我还有一个B级扩展A.在B中,我重写bar()

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

}
Run Code Online (Sandbox Code Playgroud)

最后,我从B中的一个类调用foo()

class B extends A{
  ...
  public static main(){foo()} 
}
Run Code Online (Sandbox Code Playgroud)

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

你有什么看法?

Gui*_*let 7

  1. 您无法覆盖静态方法.
  2. 由于每个方法都是静态的,因此静态引用它们.你首先打电话给A.foo()哪个打电话A.bar().由于您没有实例,因此覆盖方法不起作用.

您需要static从代码中删除所有代码并new B().foo()在主代码中使用.

考虑阅读本教程.


Hov*_*els 6

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

  • 对于任何向我投票的人,我已经达到了当天的最高投票率.请投票@Guillaume的类似答案(正如我已经做过的那样).:) (2认同)