Java程序执行入口是public static void main(String[] args)方法。它必须为public以供JVM跨类访问,static以避免实例依赖,void因JVM不处理返回值,String[] args是唯一识别的命令行参数形式;可重载或置于任意非抽象类中,但仅标准签名被JVM调用;Web应用、JUnit等例外场景无需用户定义main;常见错误包括拼写错误、大小写/空格误用、类路径缺失及IDE配置错误。

Java程序的执行入口是public static void main(String[] args)方法。JVM启动时会查找并调用这个特定签名的方法,它是整个程序运行的起点,没有它,普通Java类就无法被直接执行。
main方法为什么必须是public static void?
这是JVM识别和调用它的硬性约定:
- public:保证JVM能跨类访问该方法,权限不足会导致“Main method not found”错误
- static:JVM在不创建对象的前提下就能调用,避免构造器依赖和初始化顺序问题
- void:JVM不处理返回值,方法结束即程序退出(System.exit()除外)
- String[] args:唯一被JVM识别的参数形式,用于接收命令行输入,如java MyApp arg1 arg2中的arg1、arg2
main方法可以重载或写在任意类中吗?
可以重载,但只有标准签名的那个会被JVM选为入口;也可以写在任意非抽象、非接口的类中,只要类可被编译且路径正确:
- 一个项目里可以有多个main方法(分散在不同类),运行时通过java 类名指定入口类
- 重载示例:main(int x)或main(String... args)合法,但不会被JVM自动调用
- 如果类用了package,运行时需确保在对应包路径下,或使用完整类名(如java com.example.Hello)
不写main方法,Java程序还能运行吗?
普通Java应用必须有main方法才能被JVM作为独立程序启动;但以下情况例外:
立即学习“Java免费学习笔记(深入)”;
- Web应用(如Spring Boot)由容器(Tomcat等)托管,入口是容器的启动逻辑,不是用户代码的main
- JUnit测试由测试框架调用,无需main,但框架本身有main来驱动测试
- Applet(已淘汰)、JavaFX(自Java 11起推荐用Application.launch())有专用启动机制
- 通过JNI或脚本语言嵌入Java时,控制权不在JVM启动流程内
常见错误与调试提示
遇到“Error: Could not find or load main class”或“No main method found”,优先检查:
- 拼写是否正确:是main,不是Main或mian
- 大小写和空格:String[] args不能写成string[] args或String args[](虽语法合法,但JVM不认)
- 类文件是否在classpath中:编译后确保.class文件位置与包声明一致
- IDE运行配置是否指向了正确类:有时误点了内部类或未保存的修改










