好吧,只是为了知识,我尝试了以下情况(假设A类和B类在同一个包中(
A类
public class ClassA {
public static void main(String[] args) {
System.out.println("A");
}
}
B类
public class ClassB extends ClassA {
public static void main(String[] args) {
System.out.println("B");
}
}
在 B 类的以下变化后执行上述ClassB
它将产生 B
的输出
B类
public class ClassB extends ClassA {
//blank body
}
如果我编译并在terminal
中运行,它会给我输出A
这完全令人惊讶,因为它应该给出NoSuchMethodError
,因为他们没有主要方法如此友好地解释奇怪的行为?
注意:许多答案包含Override
单词请使用hiding
因为我们无法覆盖 java 中的静态方法。
在第一种情况下,你隐藏了main
方法,因为你在子类中定义了一个新的方法,在第二种情况下,你没有隐藏A
的主
请参阅 Java™ 教程 - 覆盖和隐藏:
如果子类定义了
static
与static
超类中的方法,则子类中的方法隐藏超类中的方法。
在 Java 中,子类继承其基类的所有方法,包括静态方法。
使用超类中方法的匹配名称和参数在子类中定义实例方法是一种覆盖。对静态方法执行相同的操作会隐藏超类的方法。
但是,隐藏并不意味着该方法消失:这两种方法都可以使用适当的语法进行调用。在您的第一个示例中,一切都很清楚:A
和B
都有自己的main
;调用A.main()
打印A
,而调用B.main()
打印B
。
在第二个示例中,还允许调用B.main()
。由于main
是从A
继承而来的,结果是打印A
。
public static void main(String[] args)
只是您在第二种情况下从A
继承的方法。