当前位置: 首页 > 面试题库 >

当我尝试覆盖静态方法时,为什么编译器没有抱怨?

上官砚文
2023-03-14
问题内容

我知道我们无法覆盖Java中的静态方法,但是有人可以解释以下代码吗?

class A {
    public static void a() { 
        System.out.println("A.a()");
    }
}

class B extends A {
    public static void a() {
        System.out.println("B.a()");
    }
}

如何a()在类中重写方法B


问题答案:

您在这里没有覆盖任何内容。要亲自查看,请尝试在类中添加@Override注解,否则Java会引发错误。public static void a()``B

你刚才定义在类中的函数B称为a(),这是不同的(毫无关系)从功能a()A

但是因为B.a()与父类中的函数具有相同的名称,所以它会 隐藏 A.a()
[如Eng所指出。Fouad]。在运行时,编译器使用声明的引用的实际类来确定要运行的方法。例如,

B b = new B();
b.a() //prints B.a()

A a = (A)b;
a.a() //print A.a(). Uses the declared reference's class to find the method.

您不能在Java中覆盖静态方法。请记住,static方法和字段与类关联,而不与对象关联。(尽管在某些语言中,例如Smalltalk,这是可能的)。

我在这里找到了一些很好的答案:Java为什么不允许覆盖静态方法?



 类似资料:
  • 问题内容: 好的,我从很多地方和来源都听说过,每当我覆盖equals()方法时,我也需要覆盖hashCode()方法。但是请考虑以下代码 这里的输出为true,完全按照我想要的方式为false,我根本不关心重写hashCode()方法。这意味着hashCode()覆盖是一种选择,而不是每个人都说的强制性选择。 我想要第二次确认。 问题答案: 它对您有用,因为您的代码未使用任何需要API的功能(Ha

  • 问题内容: 为什么无法覆盖静态方法? 如果可能,请使用示例。 问题答案: 覆盖取决于拥有类的实例。多态性的重点是可以对一个类进行子类化,并且实现那些子类的对象对于在超类中定义的相同方法(在子类中被重写)将具有不同的行为。静态方法未与类的任何实例相关联,因此该概念不适用。 影响Java设计的因素有两个。一个是对性能的关注:Smalltalk批评它太慢(垃圾回收和多态调用是其中的一部分),Java的创

  • 我试图理解为什么我们不能覆盖静态和最终方法。我不明白背后的目的。

  • 本文向大家介绍当我们尝试覆盖Java中超类的最终方法时,会发生什么?,包括了当我们尝试覆盖Java中超类的最终方法时,会发生什么?的使用技巧和注意事项,需要的朋友参考一下 子类不能重写 在超类中声明为final的 任何方法 。如果我们尝试覆盖超类的最终方法,则会在Java中收到错误消息。 实现方法覆盖的规则 方法声明应与要重写的方法相同。 在尝试覆盖之前,该类(子类)应扩展另一个类(超类)。 子类

  • 我有一些代码: 当我以交互方式评估它时,我希望为1。 当我评估代码时,我得到一个错误: GHCi,8.6.5版:http://www.haskell.org/ghc/ :? 有关编译Main(split2.hs,已解释)的帮助[1/1] split2.hs: 3:8:错误:使用“seqMax”引起的含糊类型变量“a0”阻止了约束“(RealFrac a0)”的解决。相关绑定包括测试:: a0(sp

  • 问题内容: Java不允许覆盖静态方法,但是, 在这里没有覆盖吗? 问题答案: 这是“隐藏”,而不是“覆盖”。要看到这一点,请将方法更改为以下内容: 这应该打印: 如果正在进行真正的覆盖,那么您会看到: 通常认为使用实例类型来调用静态方法是一种不好的方式,就像您正在做的那样,因为很容易想到您正在调用实例方法,并且容易误以为重写正在发生。Java样式检查器/代码审核工具通常会将其标记为样式错误/潜在