在 Java 中,main() 方法是 Java 应用程序的入口方法,程序在运行的时候,第一个执行的方法就是 main() 方法。

为什么是入口函数

main()方法说明

main()方法是程序的入口,程序执行的开始处。
main()方法被一个特定的线程“main”运行,程序会一直运行到main线程结束或者non-daemon线程终止。
看到“Exception in Thread main”如:
Excpetion in Thread main:Java.lang.NullPointedException,意味着异常来自于 main 线程。
main 方法必须声明为 public、static、void,否则 JVM 没法运行程序。main 方法在 Java 可以像其他方法一样被重载,但是 JVM 只会调用签名规范的 main 方法。

JVM源码分析

image.png
java中的class是一般类文件,mainClass是main方法所在的类文件,程序从这里开始运行。JVM会从mainClass中查找一个名称为main的静态方法,描述信息为([Ljava/lang/String;)V,这个字符串就描述了入口方法的入参和返回值,[Ljava/lang/String表示的是参数为String[],V表示的是返回值为void。
如果JVM找不到main()方法,就会抛出NoSuchMethodError:main异常。

main方法注意

一个类一般只有一个main() 方法,必须定义为“public static void main(String[] 字符串数组参数名)”,字符串数组参数用来接收执行 Java 程序的命令行参数。字符串中数组的名字(代码中的 args)可以任意设置,习惯和 Java 规范范例中 main() 参数名保持一致,命名为 args。
main()方法没有返回值:它的返回值对任何程序都没意义,只能设计成void。
访问控制权公有(public):因为main()方法是公共的,JVM就可以轻松的访问执行它。

mian()方法是静态的

如果 main 方法不声明为静态的,JVM 就必须创建 main 类的实例,因为构造器可以被重载,JVM 就没法确定调用哪个 main 方法。静态方法和静态数据加载到内存就可以直接调用而不需要像实例方法一样创建实例后才能调用(静态初始化块在 JVM 调用 main 方法前被执行,它们在类被 JVM 加载到内存时就被执行)。如果 main 方法是静态的,JVM 调用这个方法就不需要创建任何包含这个 main 方法的实例,那么它就会被加载到 JVM 上下文中成为可执行的方法。
如果要在 main() 方法中调用本类中的其他方法,则该方法也必须是静态的,否则需要先创建本类的实例对象,然后再通过对象调用成员方法。

多main方法

java中允许多个class中有main方法(c++必须且只允许有一个),根据meta描述文件里的start-class确定用哪个main作为入口,或直接由命令行指定。
idea中有三种多个main方法执行的方法:
第一种:直接右键运行
image.png
第二种:工具栏选择运行
image.png
第三种:目录栏右键运行
image.png

字符串数组参数使用

创建一个 Java 程序,编写代码实现程序执行时统计传递参数的数量及每个参数值。

  1. public class TestMain {
  2. public static void main(String[] args) {
  3. int n = args.length; // 获取参数数量
  4. System.out.println("一共有 "+n+" 个参数");
  5. if(n > 0) {
  6. // 判断参数个数是否大于0
  7. for(int i = 0;i < n;i++) {
  8. System.out.println(args[i]);
  9. }
  10. }
  11. }
  12. }

将代码保存到 TestMain.java 文件中,然后用如下 Java 命令对程序进行编译:

  1. //java TestMain 参数列表(多个之间用空格隔开)
  2. java TestMain
  3. java TestMain apple banana
  4. java TestMain one two three four five six

执行结果如下所示:

  1. C:\Users\leovo>d:
  2. D:\myJava>javac TestMain.java
  3. D:\myJava>java TestMain
  4. 一共有 0 个参数
  5. D:\myJava>java TestMain apple banana
  6. 一共有 2 个参数
  7. apple
  8. banana
  9. D:\myJava>java TestMain one two three four five six
  10. 一共有 6 个参数
  11. one
  12. two
  13. three
  14. four
  15. five
  16. six
  17. D:\myJava>
  1. idea运行调用args:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27659006/1649665920374-a2eda205-d3aa-45b3-81a2-0618f686f4f0.png#clientId=u77e5a249-45e4-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=102&id=u239fa544&margin=%5Bobject%20Object%5D&name=image.png&originHeight=128&originWidth=417&originalType=binary&ratio=1&rotation=0&showTitle=false&size=12099&status=done&style=none&taskId=ufe9f8906-fd9f-412d-85b2-6455efa7c81&title=&width=333.6)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27659006/1649665975623-a7f7f531-7fe9-4e5c-b857-a14e221d7b9d.png#clientId=u77e5a249-45e4-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=136&id=u9c0d526b&margin=%5Bobject%20Object%5D&name=image.png&originHeight=170&originWidth=653&originalType=binary&ratio=1&rotation=0&showTitle=false&size=15744&status=done&style=none&taskId=u82128505-32fe-40bb-abe0-ecdbea02039&title=&width=522.4)