3

给定一个名为TestMainFunction.java的 Java 源文件

1.) 我们大多数人都知道,Java 文件名必须是包含 main 函数的类名

请参阅下面的简单代码(在如上所述命名的单个文件中)完美执行并打印ClassOne.

public class TestMainFunction {}

class ClassOne {
    public static void main(String[] a) {
        System.out.println("ClassOne");
    }
}

2.) 当单个文件中有多个具有主函数的类时,Eclipse 会提示用户选择要运行的类。

请参阅下面的简单代码(如上所述命名的单个文件),它完美执行并打印我们从 Eclipse 提示符中选择的类名。

public class TestMainFunction {
    public static void main(String[] a) {
        System.out.println("TestMainFunction");
    }
}

class ClassOne {
    public static void main(String[] a) {
        System.out.println("ClassOne");
    }
}

class ClassTwo {
    public static void main(String[] a) {
        System.out.println("ClassTwo");
    }
}

正如我所提到的,以上所有内容都将起作用。它将为每个类创建单独的 .class 文件。即使在使用内部类时,同样的行为也适用。

但是这里到底发生了什么?当一个源文件中存在多个类时,Eclipse 如何知道要启动哪个类?任何人都可以解释一下吗?解释这一点将不胜感激。

4

1 回答 1

6

大多数人都知道,Java 文件名必须是包含 main 函数的类名

这是不正确的,我相信您的困惑的根源。Java 源文件只允许有一个公共类,并且它必须与包含文件具有相同的名称(减去扩展名)。但是,给定的 Java 源文件可能包含任意数量的非公共类文件,唯一的限制是它们的名称是有效的。请注意,您可以拥有一个与其包含的源文件(减去扩展名)同名的类,它不是公共的!另请注意,在单个 Java 源文件中包含多个顶级(非嵌套)类通常被认为是不好的做法。

您可能有的第二个假设是源文件中只允许一个类具有主函数。这是不真实的。您可以为每个类文件添加一个 main 函数——唯一重要的是您在启动应用程序时指定给 JVM 的那个。

因此,鉴于您的场景 - 一个具有多个类文件(其中一个是公共文件)的源文件,其中每个类都有一个 main 方法,以下适用:

  • 当您在 Eclipse 中对该文件调用 Run 命令时,Eclipse 将检测到有多个符合条件的类要运行,并提示您选择其中一个类。然后它将为选定的类构建一个“运行配置文件”,仅启动该类。您实际上可以通过 Run->Debug Configurations 菜单查看 Eclipse 构建的配置文件。
  • 在外部编译这个源文件时,会生成多个 .class 文件(不仅仅是一个)。这些类彼此没有关系,保存在同一个源文件中,您将明确选择要在 JVM 中启动的 .class。

IE:

java TestMainFunction
java ClassOne
java ClassTwo
于 2013-02-26T12:24:30.920 回答