我希望以下代码有编译器问题,但令人惊讶的是它没有。
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()
方法被执行了?这背后的理由是什么?
答案 0 :(得分:4)
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...
无论如何都会被解析为String[]
,因此签名是等效的。
答案 1 :(得分:1)
a)为什么编译器会抱怨它?这些方法在两个不同的类中定义,这在Java中是完全合法的(尽管可能不建议在超类和子类中使用相同的字段名称)。
b)这取决于你在哪个班级;你必须运行p
课程。
答案 2 :(得分:1)
main方法充当程序的入口点。通过在多个类中声明多个main方法,您只声明了多个入口点,Java对此没有任何问题。
当您通过命令行运行程序时,您必须指定应将哪个类用作入口点。假设您的源文件名为p.java
,请运行您的程序:
java p
将导致调用p的main方法,而如果使用以下命令运行程序
java child
child
类的主要方法将运行而不是p