🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# Java 覆盖最终静态方法 – 方法是覆盖还是隐藏? > 原文: [https://howtodoinjava.com/oops/understanding-the-compiler-error-message-when-hiding-final-static-methods/](https://howtodoinjava.com/oops/understanding-the-compiler-error-message-when-hiding-final-static-methods/) 我们可以覆盖 Java 中的静态方法吗? 好吧,我们所有人都知道[方法覆盖和方法隐藏](https://docs.oracle.com/javase/tutorial/java/IandI/override.html "method overriding and method hiding")。 您是否尝试过**覆盖静态方法**,特别是在父类中方法为`final`时。 ## 覆盖最终静态方法的 Java 程序 下面是我编写的用于测试各种关键字组合的程序。 因此,请参考该程序进行进一步的讨论。 ```java package staticTest; class SuperClass { static void display() { System.out.println("Super"); } } class SubClass extends SuperClass { static void display() { System.out.println("Sub"); } } public class Test { public static void main(String[] args) { // Prints "Super" in console SuperClass sup = new SubClass(); sup.display(); // Prints "Sub" in console SubClass sub = new SubClass(); sub.display(); } } ``` ## 是方法覆盖还是方法隐藏? 1. 上面的代码将成功编译,而不会发出警告或错误。 **方法隐藏**就是这种情况,子类的静态方法从超类隐藏了静态方法。 2. 如果我们从子类的显示方法中删除`static`关键字,则编译器会报错您**无法覆盖超类的静态方法**。 众所周知,静态方法不能被覆盖。 它们只能从子类中隐藏。 因此,这种情况下的编译器消息应被认为是错误的。 **正确消息**应该为“实例方法无法从超类“隐藏”静态方法”。 现在在上面的代码示例中,将`final`添加到超类的显示方法中。 再次,编译器开始报错“**无法从超类覆盖最终方法**”。 由于上述原因,这也会产生误导。 在这里,正确的消息也应该是“无法**隐藏**超类的最终方法” ## 总结 为什么在 Java 中不能覆盖静态方法? 以我的观点,**方法覆盖**仅在我们使用实例方法进行讨论时才有效。 一旦我们开始谈论静态方法,就应该使用隐藏的**方法**。 幸运的是,以上术语已在大多数 Java 文献中使用(甚至在 Java 语言规范中也是如此),但我想仍然必须对其进行更新。 请让我知道您对 Java 覆盖最终静态方法的想法,为什么在 Java 中不能覆盖静态方法,而在 Java 中我们可以覆盖非静态方法呢? 学习愉快!