为什么没有找到主方法时没有生成异常或错误?

时间:2015-04-06 13:07:41

标签: java main

好的只是为了清酒知识,我尝试了下面的案例(假设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中的静态方法。

3 个答案:

答案 0 :(得分:7)

在第一种情况下,您隐藏了main方法,因为您在子类中定义了一个新方法,在第二种情况下,您没有&#t} ll固有A的主要内容。

请参阅The Java™ Tutorials - Overriding and Hiding

  

如果子类定义具有与a相同签名的static方法   超类中的static方法,然后子类中的方法 隐藏 超类中的方法

答案 1 :(得分:2)

在Java子类中继承其基类的所有方法,包括它们的静态方法。

使用匹配的名称和超类中方法的参数定义子类中的实例方法是一种覆盖。为静态方法做同样的事情隐藏超类的方法。

隐藏并不意味着该方法消失了:两种方法都可以使用适当的语法进行调用。在您的第一个示例中,一切都很清楚:AB都有自己的main;调用A.main()时会调用A,同时调用B.main()会打印B

在第二个示例中,也允许调用B.main()。由于main是从A继承的,因此结果是打印A

答案 2 :(得分:0)

public static void main(String[] args)只是您在第二种情况下从A继承的方法。