Java中的多个主要方法

时间:2013-09-06 00:48:30

标签: 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);
  }
}

任何人都可以告诉我:

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

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

3 个答案:

答案 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