# 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 中我们可以覆盖非静态方法呢？

学习愉快！