我知道我们不能覆盖 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
类中的 public static void a()
之前放置 @Override
注释,Java 会抛出错误。
您刚刚在 B
类中定义了一个名为 a()
的函数,它与函数 a()
不同(没有任何关系) > 在类 A
中。
但是因为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 中的静态方法。请记住,static
方法和字段与类相关联,而不是与对象相关联。 (尽管在 Smalltalk 等某些语言中,这是可能的)。
我在这里找到了一些很好的答案:Why doesn't Java allow overriding of static methods?
关于java - 为什么当我尝试覆盖静态方法时编译器不提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16617408/