为什么当我尝试重写静态方法时编译器不抱怨?

2022-09-01 07:20:41

我知道我们不能在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


答案 1

你没有在这里覆盖任何东西。为了亲眼看看,尝试在课堂上之前放置注释,Java会抛出一个错误。@Overridepublic static void a()B

您刚刚在名为 的类中定义了一个函数,该函数与类 中的函数不同(没有任何关系)。Ba()a()A

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

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 中重写静态方法。请记住,方法和字段与类相关联,而不是与对象相关联。(虽然,在某些语言中,如Smalltalk,这是可能的)。static

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


答案 2

这称为 ,如 Java 教程重写和隐藏方法中所述:hiding a method

如果子类定义了与超类中的类方法具有相同签名的类方法,则该子类中的方法将隐藏超类中的方法。


推荐