【问题标题】:Override a protected method, and try to call it from the super class覆盖受保护的方法,并尝试从超类调用它
【发布时间】:2012-05-14 10:54:29
【问题描述】:

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

我有一个 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( )。我怎样才能做到这一点?

你有什么意见?

【问题讨论】:

    标签: java overriding extends


    【解决方案1】:
    1. 您不能覆盖静态方法。
    2. 由于每个方法都是静态的,它静态地引用它们。您首先调用A.foo(),后者又调用A.bar()。由于您没有实例,因此覆盖方法不起作用。

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

    考虑阅读此tutorial

    【讨论】:

      【解决方案2】:

      您不能覆盖静态方法,只能覆盖非静态实例方法。您正在尝试在静态环境中使用继承,但这是行不通的。如果您确实需要继承(通常当您认为需要时,实际上不需要),那么请使方法成为非静态方法。

      【讨论】:

      • 对于任何支持我的人,我已经达到了当天的投票上限。请投票@Guillaume 的类似答案(正如我已经做过的那样)。 :)
      猜你喜欢
      • 2015-10-01
      • 2013-07-01
      • 2022-07-08
      • 2011-08-04
      • 2019-09-26
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多