2

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

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);
  }
}

谁能告诉我:

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

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

4

3 回答 3

5

main方法与 Java 中的任何其他方法一样,因为您可以在多个类上具有相同的名称和签名。

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

您必须具有指定的类p才能运行:

$ java p
10

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

$ java child
20

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

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

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

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

于 2013-09-06T00:54:31.290 回答
1

a) 为什么编译器会抱怨它?这些方法在 2 个不同的类中定义,这在 Java 中是完全合法的(尽管可能不建议在超类和子类中使用相同的字段名称)。

b)这取决于您正在运行的课程;你一定在p上课。

于 2013-09-06T00:56:10.930 回答
1

main 方法充当程序的入口点。通过在多个类中声明多个 main 方法,您只声明了多个入口点,Java 对此没有任何问题。

毕竟,当您通过命令行运行程序时,您必须指定应将哪个类用作入口点。假设你的源文件被调用p.java,运行你的程序:

java p

将导致调用 p 的 main 方法,而如果您使用以下命令运行程序:

java child

类的主要方法child将运行而不是p

于 2013-09-06T00:57:07.453 回答