为什么在找不到主要方法时不生成异常或错误?

why Exception or Error not generated when no main method found?

好的,为了知识,我尝试了以下情况(假设 Class 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.[=20=中的静态方法]

在第一种情况下,你隐藏了 main 方法,因为你在子类中定义了一个新方法,在第二种情况下你没有,你将固有 A的主要。

参见The Java™ Tutorials - Overriding and Hiding

If a subclass defines a static method with the same signature as a static method in the superclass, then the method in the subclass hides the one in the superclass.

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

在 Java sub类 中继承其基础 类 的所有方法,包括其静态方法。

在子类中使用与超类中方法的匹配名称和参数定义实例方法是重写。对静态方法做同样的事情隐藏超类的方法。

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

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