关于函数方法执行流程的疑问
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 就会:
- 加载
MyClass - 查找是否存在符合签名的
main - 找到 → 调用
- 找不到 → 报错
四、为什么 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,
都是被运行时系统调用的第一个“用户代码函数”。

浙公网安备 33010602011771号