我预计以下代码会出现编译器问题,但令人惊讶的是它没有。
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()方法正在执行?这背后的原理是什么?
该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[],因此签名是等效的。