编程

Java 基础 - Java main() 方法解析

708 2024-10-21 09:55:00

1. 概述

每个程序都需要一个开始执行的地方;说到 Java 程序,这就是 main 方法。

我们习惯于在代码会话中编写 main 方法,以至于我们甚至不注意它的细节。在这篇短文中,我们将分析这种方法,并展示一些其他的编码方法。

2. 常见签名

最常见的 main 方法模板是:

public static void main(String[] args) { }

这就是我们一开始了解它的方式,也是 IDE 为我们自动补全代码的方式。但这并不是这种方法可以采取的唯一形式,我们可以使用一些有效的变体,但并不是每个开发人员都注意到这一点。

在我们深入研究这些方法签名之前,让我们回顾一下这个常见签名的每个关键字的含义:

  • public – 访问修饰符,意味着全局可见
  • static – 该方法可以直接从类中访问,我们不必实例化对象来获取其引用并使用
  • void – 意味着该方法不返回值
  • main – 方法名,执行 Java 程序时,JVM 查找的标识符

至于 args 参数,它代表该方法接收的值。这就是当我们启动程序时,传递参数的方法。

参数 args 是一个 String 的数组。下例中:

java CommonMainMethodSignature foo bar

我们正在执行一个名为 CommonMainMethodSignature 的 Java 程序,并传递 2 个参数:foobar。这些值可以在 main 方法中作为 args[0](以 foo 为值)和 args[1](以 bar 为值)访问。

在下一个示例中,我们检查 args 以决定是加载测试参数还是生产参数:

public static void main(String[] args) {
    if (args.length > 0) {
        if (args[0].equals("test")) {
            // load test parameters
        } else if (args[0].equals("production")) {
            // load production parameters
        }
    }
}

IDE 也可以向程序传递参数。

3. 编写 main() 方法的不同方式

让我们看看编写 main 方法的不同方式。虽然它们不太常见,但是是有效的签名。

请注意,这些都不是 main 方法特有的,它们可以与任何 Java 方法一起使用,但它们也是 main 方法的有效部分。

方括号可以放在 String 附近,就像在通用模板中一样,也可以放在另一侧的 args 旁边:

public static void main(String []args) { }
public static void main(String args[]) { }

参数也可以表示为可变参数:

public static void main(String...args) { }

我们甚至可以添加 strictfpmain() 方法,其用于处理浮点值时处理器之间的兼容性:

public strictfp static void main(String[] args) { }

synchronizedfinal 也是 main 方法的有效关键字,不过他们在此处没有影响。

final 可以在 args 上使用,用来避免数组被修改:

public static void main(final String[] args) { }

为了结束这些示例,我们还可以使用上述所有关键字编写 main 方法(当然,你可能永远不会在实际应用中使用这些关键字):

final static synchronized strictfp void main(final String[] args) { }

4. 不止一个 main() 方法

我们也可以在应用中定义不止一个 main 方法

事实上,有些人将其用作验证单个类的基础测试技术(尽管像 JUnit 这样的测试框架更适合此活动)。
为指定 JVM 应该执行哪个 main 方法作为应用的入口点,我们使用 MANIFEST.MF 文件。在清单中,我们可以指示 mian 类:

Main-Class: mypackage.ClassWithMainMethod

这主要用于创建可执行 .jar 文件。我们通过位于 META-INF/MANIFEST.MF(UTF-8 编码)的 manifest 文件指示哪个类具有用来启动执行的 main 方法。

5. 结论

本教程详细介绍了 main 方法及其可以采用的其他形式,甚至是大多数开发人员不太常见的形式。

请记住,尽管我们展示的所有示例在语法方面都是有效的,但它们只是用于教育目的,大多数时候我们会坚持使用通用签名来完成我们的工作。