为什么当我尝试重写静态方法时编译器不会抱怨?
我知道我们不能在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
是单独的方法副本
static
与class
相关而不是Object
的状态
上一篇: Why doesn't the compiler complain when I try to override a static method?