2

我的问题来自一个项目。所以让我抽象出一些无关的细节。

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

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

} 

现在我还有一个扩展 A 的 B 类。在 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( )。我怎样才能做到这一点?

你有什么意见?

4

2 回答 2

7
  1. 您不能覆盖静态方法。
  2. 由于每个方法都是静态的,因此它静态地引用它们。你先打电话A.foo(),然后再打电话A.bar()。由于您没有实例,因此覆盖方法不起作用。

您需要static从您的代码中删除所有内容并new B().foo()在您的 main.xml 中使用。

考虑阅读本教程

于 2012-05-04T21:52:31.620 回答
6

您不能覆盖静态方法,只能覆盖非静态实例方法。您正在尝试在静态环境中使用继承,但这是行不通的。如果你真的需要继承(通常当你认为你需要继承时,实际上你不需要),然后将方法设置为非静态的。

于 2012-05-04T21:50:58.813 回答