可能重复:
为什么 Java 不允许覆盖静态方法?
是否有任何正当理由希望派生类覆盖隐藏static
基类的方法?
除了术语,Java 中的静态方法确实有一种覆盖关系,二进制兼容性第 13.4.12 节暗示了这种关系。如果 T 扩展了 S,S 声明了 m(),Tm() 可以引用 T 或 S 中的方法,这取决于是否在 T 中声明了 m();并且可以在 T 中添加或删除 m(),而不会破坏任何调用 Tm() 的代码。(这意味着 JVM 调用静态指令执行一种动态方法查找超类链)
然而,这不过是麻烦。如果 Tm() 的含义悄悄地改变,那真的很危险,因为它现在指向不同的方法。(实例方法应该继承契约,所以这不是问题;静态方法中没有这样的理解。)
所以这个“特性”永远不应该被使用;语言不应该让它开始。
好的做法:如果我们调用 Tm(),m() 必须在 T 中声明;并且在不首先删除所有 Tm() 的情况下,绝不应将其从 T 中删除。
静态方法不能被覆盖
为了覆盖一个方法,该方法必须首先被继承。如果方法没有被继承,就没有机会被覆盖。因此,您永远不能覆盖私有方法,因为它们不是继承的。