关于函数方法执行流程的疑问

mian函数

Q: 为什么会自动调用main方法/函数?

A: main 不是“自动调用”的,而是被“运行时系统”按照约定调用的。

  • C:由 操作系统 + C 运行时(CRT) 调用 main

  • Java:由 JVM 调用 main

一、先说 C:main 真的是“入口函数”吗?

实际上不是 👇

在 C 程序中:

int main() {
    return 0;
}

你以为程序是从 main 开始的,但真实流程是:

OS
 ↓
_start          (CRT 启动代码)
 ↓
初始化运行环境
 ↓
调用 main()
 ↓
main 返回
 ↓
exit

👉 main 是被调用的,不是起点


二、Java 完全一样,只是换了角色

Java 程序的真实启动流程

操作系统
 ↓
java 命令
 ↓
JVM 启动
 ↓
类加载 / 初始化
 ↓
找到 main 方法
 ↓
调用 main(String[] args)

👉 所以:

  • 不是 Java 语言自动
  • 而是 JVM 按规则调用

三、那 JVM 凭什么“知道”要调用 main?

答案:约定(Convention)

JVM 规范里写死了:

如果一个类要作为程序入口,
它必须提供:

public static void main(String[] args)

只要你告诉 JVM:

java MyClass

JVM 就会:

  1. 加载 MyClass
  2. 查找是否存在符合签名的 main
  3. 找到 → 调用
  4. 找不到 → 报错

四、为什么 main 必须是 static?(关键)

你前面问过 static,这里正好串起来 👇

JVM 调用 main 时:

  • 还没有任何对象
  • JVM 只能通过 类名 调用方法

所以:

public static void main(...)

不是设计偏好,而是必然要求


五、为什么参数是 String[] args

对比 C:

int main(int argc, char* argv[])

Java:

public static void main(String[] args)

本质一样:

  • args = 命令行参数
  • JVM 负责解析并传入

六、为什么不能自己改入口函数名字?

你可能会想:

“我能不能用 start() 作为入口?”

可以,但要你自己写“启动器”:

public class Boot {
    public static void main(String[] args) {
        App.start();
    }
}

👉 JVM 只认 main
👉 其他都是你自己的规则


七、所以「自动调用 main」这句话哪里不严谨?

更准确的说法是:

当你运行一个 Java 程序时,
JVM 按照规范,主动查找并调用 main 方法。

并没有什么“神秘自动”。


八、用一句 C 程序员能秒懂的话收尾

Java 的 main
就相当于 C 里的 main
都是被运行时系统调用的第一个“用户代码函数”。

posted @ 2026-01-12 17:25  yorkchain  阅读(3)  评论(3)    收藏  举报