笔者注:main函数作为Java应用的入口函数可以当作是类C语言的一种约定。
The Java™ Tutorials 中的 [1]Lesson: A Closer Look at the "Hello World!" Application 中提到(这里是笔者的翻译总结,更详细的说明建议参考原文):
- 每个Java应用中都必须包含签名为 public static void main(String[] args) 的 main 方法。该 main 方法与 C/C++ 的 main 函数类似,它是 Java 应用的入口函数,并且随后会根据程序需要调用其他方法。main 函数接收一个 String 数组参数,它通过运行时系统传递过来,这些参数被称为命令行参数,可直接作用于应用的运行行为而不需要重新编译。
以下逐一分析定义为 public static void main(String[] args) 的含义
- public
-
- 访问权限修饰符,只有声明为public才能被任意访问,才能被JVM调用执行,其他修饰符都不行,外部没有访问权限(既不在应用的package内,更没有继承关系)
- [2]12.1. Java Virtual Machine Startup 中提到:
-
-
- The Java Virtual Machine starts execution by invoking the method main of some specified class, passing it a single argument, which is an array of strings.
-
- static
-
- 关键词,意味着类加载后,JVM 可以直接调用 main 方法而无需实例化。
- 只有 static 方法才能通过 ClassName.methodName() 直接进行调用,非 static 方法需要实例化后才能调用其实例方法,JVM 并没有义务、也没有意义、更不清楚怎么去实例化( main 方法主类可能存在多个构造器,也无法知道具体参数,还有可能主类的构造器是私有的;抽象类也可以有 main 函数入口,而抽象类无法实例化)。
- 从功能上讲,main 函数是应用入口,此函数按需处理应用的所有操作,JVM 只需调用执行即可,并不需要其他多余的处理。
- (其他可能存在的二义性,待补充。。。)
- void
-
- 返回类型,JVM 并不期望从 main 方法获取返回值,因此使用空返回类型void。
- Java 应用可以通过 System.exit(int status) 方法等方式提前主动退出,main() 的返回值没有意义,当然也可以通过其他方式来传递返回值,参考 [3]12.8. Program Exit 和 [5]Why is main() in java void?。
- main
-
- 类C语言应用入口函数的一种命名约定。
- 实际上,Java 语言规范和 JVM 规范规定从 main 函数执行的,这是按照语言规范的约束。
- String[] args
-
- main 方法接收的参数,命令行参数传递过来后被存储在 args 中;当然也可以忽略,不传递参数,不使用参数。
- args 只是一个约定命名,实际上是可以随意命名的
Java 应用的入口是 main 函数,以下写法实际上方法签名都是合理且等价的,其中 args 还可以随意命名:
- public static void main(String[] args){...} (默认使用这种方式)
- static public void main(String[] args){...}
- public static void main(String args[]){...}
- public static void main(String... args){...}
参考
- [1]Lesson: A Closer Look at the "Hello World!" Application https://docs.oracle.com/javase/tutorial/getStarted/application/index.html#MAIN
- [2]12.1.4. Invoke Test.main https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.1.4
- [3]12.8. Program Exit https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.8
- [4]Why is the Java main method static? https://stackoverflow.com/questions/146576/why-is-the-java-main-method-static
- [5]Why is main() in java void? https://stackoverflow.com/questions/540396/why-is-main-in-java-void
- [6]What does public static void main args mean? https://stackoverflow.com/questions/29276917/what-does-public-static-void-main-args-mean
- [7]public static void main(String arg[ ] ) in java is it fixed? https://stackoverflow.com/questions/10028589/public-static-void-mainstring-arg-in-java-is-it-fixed