Java基础(008):对 public static void main(String[] args) 的理解

笔者注: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){...}
 
参考

原文地址:https://www.cnblogs.com/wpbxin/p/14534225.html