【问题标题】:Why instance method cannot override the static method [duplicate]为什么实例方法不能覆盖静态方法[重复]
【发布时间】:2017-10-06 11:38:42
【问题描述】:
class Abc{
public  static void hello(){
    System.out.println("parent");//Line1
 }
}

class Abc1 extends Abc{
public  void hello(){//Line2
    System.out.println("child");//Line3
 }
}

编译器在第 3 行给出错误提示

此实例方法不能覆盖来自 Abc 的静态方法

为什么静态方法不能被实例方法覆盖?

【问题讨论】:

  • 第二种方法需要一个ABC1类的对象实例。
  • 因为覆盖只对多态实例方法有意义?

标签: java inheritance


【解决方案1】:

简单:因为语言规范是这么说的。

这是静态方法的缺点之一:它们没有多态性!从概念上讲,它们不应该被覆盖。仅此而已。

确切地说:JLS 表示区分静态和非静态方法和状态:

总是针对一个对象调用实例方法,该对象在方法体执行期间成为关键字 this 和 super 所引用的当前对象。

【讨论】:

  • 具有如此高声望的人不应该回答明显的重复......
  • 是的。但我倾向于将我的答案保留在这里——因为它提供了在该 DUP 上找不到的某种洞察力;至少不是那种明确的措辞。但我听到了。下次会更努力地抵抗。
  • 我找到了答案。如果我创建 Abc1 的对象并将其分配给 Abc(Abc a = new Abc1())。然后如果我尝试调用 a.hello() 方法,则在运行时 JVM 不明白它是否必须调用静态方法对象的引用或实例,这反过来又会产生歧义。
  • 不确定我是否明白你的意思。长话短说:我能做些什么来让这个答案在你眼中值得接受吗?
  • 感谢您的回答 GhostCat。通过实际的解释,我能够理解这些事情。
猜你喜欢
  • 2011-01-04
  • 1970-01-01
  • 2012-07-03
  • 2014-09-28
  • 2011-09-16
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多