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

我知道我们不能在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()");
    }
}

我如何能够覆盖B类中的方法a()


你没有在这里覆盖任何东西。 要亲自看看,请尝试在类B和Java中的public static void a()之前放置@Override注释,并引发错误。

您只是在类B定义了一个名为a()的函数,它与A类中的函数a()不同(与任何关系无关)。

但是因为Ba()与父类中的函数具有相同的名称,所以它隐藏了 Aa() [正如Eng指出的那样。 福阿德。 在运行时,编译器使用声明引用的实际类来确定要运行的方法。 例如,

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不允许重写静态方法?


这就是所谓的hiding a method ,如Java教程覆盖和隐藏方法所述:

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


static方法不会被继承,因此它的B是单独的方法副本

staticclass相关而不是Object的状态

链接地址: http://www.djcxy.com/p/4115.html

上一篇: Why doesn't the compiler complain when I try to override a static method?

下一篇: Method accessibility inside package