Java 覆盖最终静态方法 – 方法是覆盖还是隐藏?

Java 覆盖最终静态方法 – 方法是覆盖还是隐藏?

原文: https://howtodoinjava.com/oops/understanding-the-compiler-error-message-when-hiding-final-static-methods/

我们可以覆盖 Java 中的静态方法吗? 好吧,我们所有人都知道方法覆盖和方法隐藏。 您是否尝试过覆盖静态方法,特别是在父类中方法为final时。

覆盖最终静态方法的 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 中我们可以覆盖非静态方法呢?

学习愉快!