好的只是为了清酒知识,我尝试了下面的案例(假设A类和B类在同一个包中)
ClassA
public class ClassA {
public static void main(String[] args) {
System.out.println("A");
}
}
ClassB
public class ClassB extends ClassA {
public static void main(String[] args) {
System.out.println("B");
}
}
执行ClassB
以上,现在在classB中进行以下更改后会产生B
的输出
ClassB
public class ClassB extends ClassA {
//blank body
}
如果我编译并在terminal
中运行它会给我输出A
,这完全令人惊讶,因为它应该给出NoSuchMethodError
,因为没有主要的方法是他们如此善意地解释这种奇怪的行为?
注意:许多答案包含Override
字,请使用hiding
,因为我们无法覆盖java中的静态方法。
答案 0 :(得分:7)
在第一种情况下,您隐藏了main
方法,因为您在子类中定义了一个新方法,在第二种情况下,您没有&#t} ll固有A
的主要内容。
请参阅The Java™ Tutorials - Overriding and Hiding:
如果子类定义具有与a相同签名的
static
方法 超类中的static
方法,然后子类中的方法 隐藏 超类中的方法
答案 1 :(得分:2)
在Java子类中继承其基类的所有方法,包括它们的静态方法。
使用匹配的名称和超类中方法的参数定义子类中的实例方法是一种覆盖。为静态方法做同样的事情隐藏超类的方法。
隐藏并不意味着该方法消失了:两种方法都可以使用适当的语法进行调用。在您的第一个示例中,一切都很清楚:A
和B
都有自己的main
;调用A.main()
时会调用A
,同时调用B.main()
会打印B
。
在第二个示例中,也允许调用B.main()
。由于main
是从A
继承的,因此结果是打印A
。
答案 2 :(得分:0)
public static void main(String[] args)
只是您在第二种情况下从A
继承的方法。