Java 基础 - Java main() 方法解析
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 个参数:foo
和 bar
。这些值可以在 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) { }
我们甚至可以添加 strictfp
给 main()
方法,其用于处理浮点值时处理器之间的兼容性:
public strictfp static void main(String[] args) { }
synchronized
和 final
也是 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 方法及其可以采用的其他形式,甚至是大多数开发人员不太常见的形式。
请记住,尽管我们展示的所有示例在语法方面都是有效的,但它们只是用于教育目的,大多数时候我们会坚持使用通用签名来完成我们的工作。