当前位置: 首页 > 知识库问答 >
问题:

为什么实例方法不能重写静态方法[duplicate]

鲁永福
2023-03-14
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中的静态方法

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

共有1个答案

卢承弼
2023-03-14

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

这是静态方法的缺点之一:它们没有多态性!从概念上讲,它们并不意味着被推翻。这就是一切。

准确地说:JLS说区分静态和非静态方法和状态:

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

 类似资料:
  • Test类是超级类,Fest是它的子类,因为我们知道静态方法不能被重写,即使我遇到了“静态方法不能在java中隐藏实例方法”这样的错误,有人能解释一下吗,提前谢谢。

  • 输出为"A的静态方法"。因此静态方法不会被重写,否则输出将是“静态方法B”。JVM如何在运行时决定调用类A而不是B的静态方法。

  • 伙计们,我有一个简单但令人讨厌的问题。据我所知,基本上意味着,对于该类的每个实例,这个方法将是相同的,如果我们改变它,这将改变该类的每个实例,它也被称为类方法。那么,如果我有一个类,它实现了某种格式的方法,让我们说: 为什么不能设置为静态?因为该类的每个实例的格式都是相同的。。。?

  • 问题内容: 在静态上下文中,为什么不能调用的静态版本(而不是必须使用)? 编译器不够聪明,无法确定何时使用对象方法+何时使用静态方法吗? 注意: 我并不是说应该使用a 而不 是非静态方法(这很明显- 如果是的子类,则a的of 可能返回或其他,必须在运行时确定)。 我是说我想知道为什么没有 两个 版本,一个是仅适用于静态上下文的静态方法,另一个是常规的非静态方法。如果不可能,那就不可能了,那就是答案

  • 问题内容: 我很困惑为什么不允许以下内容: 我知道为什么接口中的方法不能是静态的,但是为什么覆盖方法不能是静态的? 我希望所有类都可以实现该方法,但目前仅限于如果已经实例化了该对象而无法调用该方法,则只能调用该方法… **_更新: _ 感谢您的回答,我现在对此有了更好的了解。基本上,我不应该尝试使实用程序类(或与此相关的工厂类)实现接口(或者至少不是这样)。 问题答案: 在Java中调用静态方法要

  • 操作步骤: 菜单栏: Refactor --> Convert to Instance Method