Java中的多个主要方法

Und*_*Dog 2 java

我预计以下代码会出现编译器问题,但令人惊讶的是它没有。

class p {
  static int a = 10;

  public static void main(String...args) {
    System.out.println(a);
  }
}

class child extends p {
  public static void main(String[] args) {
    System.out.println(p.a+10);
  }
}
Run Code Online (Sandbox Code Playgroud)

谁能告诉我:

a) 为什么编译器没有抱怨多种main()方法?

b) 当我从命令行执行上述程序时,我可以看到只有类 p 的main()方法正在执行?这背后的原理是什么?

rge*_*man 5

main方法就像 Java 中的任何其他方法一样,您可以在多个类上使用相同的名称和签名。

这很特别,因为要在 Java 中运行任何东西,您必须指定包含main要运行的正确方法的类。

您必须指定p要运行的类:

$ java p
10
Run Code Online (Sandbox Code Playgroud)

您还可以指定child要运行的类:

$ java child
20
Run Code Online (Sandbox Code Playgroud)

编译child类会给你一个警告:

Child.java:3: 警告:在 Child 中的 main(java.lang.String[]) 不能覆盖 P 中的 main(java.lang.String...);缺少覆盖方法“...”

但是我们已经知道static方法不是继承的。没关系,反正我们也不打算继承这里。

此外,无论如何都String...被解析为 a String[],因此签名是等效的。