Java 覆盖最终静态方法 – 方法是覆盖还是隐藏?
我们可以覆盖 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();
}
}
是方法覆盖还是方法隐藏?
- 上面的代码将成功编译,而不会发出警告或错误。 方法隐藏就是这种情况,子类的静态方法从超类隐藏了静态方法。
-
如果我们从子类的显示方法中删除
static
关键字,则编译器会报错您无法覆盖超类的静态方法。众所周知,静态方法不能被覆盖。 它们只能从子类中隐藏。 因此,这种情况下的编译器消息应被认为是错误的。 正确消息应该为“实例方法无法从超类“隐藏”静态方法”。
现在在上面的代码示例中,将final
添加到超类的显示方法中。 再次,编译器开始报错“无法从超类覆盖最终方法”。
由于上述原因,这也会产生误导。 在这里,正确的消息也应该是“无法隐藏超类的最终方法”
总结
为什么在 Java 中不能覆盖静态方法? 以我的观点,方法覆盖仅在我们使用实例方法进行讨论时才有效。 一旦我们开始谈论静态方法,就应该使用隐藏的方法。
幸运的是,以上术语已在大多数 Java 文献中使用(甚至在 Java 语言规范中也是如此),但我想仍然必须对其进行更新。
请让我知道您对 Java 覆盖最终静态方法的想法,为什么在 Java 中不能覆盖静态方法,而在 Java 中我们可以覆盖非静态方法呢?
学习愉快!