java - 为什么当我尝试覆盖静态方法时编译器不提示?

标签 java static-methods overriding

我知道我们不能覆盖 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/

相关文章:

java - 从数组中删除连续元素的最有效方法? java

java - 如何在超时时调用 TestNG Reporter.log?

java - Spring MVC-来自 Controller 的几个部分/ View

c++ - 私有(private)静态成员函数有什么用?

CSS 类不会覆盖边框样式

python - 覆盖 Django 的 ModelChoiceField

java - Android Socket Connection Refused ETIMEDOUT(连接超时)

C++ Meyers Singleton - 线程安全(代码等效于互斥锁?)

php - 是否有命名空间单例类的快捷方式

C++通过继承函数实现继承的抽象函数