
完全合法且常见:main方法虽为静态入口,但可在其中安全创建本类或任意其他类的实例,用于启动面向对象逻辑;这并非递归调用,而是程序初始化的标准实践。
完全合法且常见:`main`方法虽为静态入口,但可在其中安全创建本类或任意其他类的实例,用于启动面向对象逻辑;这并非递归调用,而是程序初始化的标准实践。
在Java中,public static void main(String[] args) 是JVM启动应用程序的唯一约定入口点。它被设计为static,是因为JVM在不创建任何对象的前提下,必须能直接定位并调用该方法——这是面向对象世界得以启动的“第一推动力”。而正因main是静态的,它本身不属于任何对象实例,因此在其中创建本类对象(如 new Main())不仅合法,而且是绝大多数Java程序的标准起点。
例如以下代码完全正确且可执行:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
public class Main {
private String message = "Hello from instance!";
void something() {
System.out.println(message);
}
public static void main(String[] args) {
Main m = new Main(); // ✅ 合法:在main中创建本类实例
m.something(); // 输出:Hello from instance!
}
}
⚠️ 需注意的关键点:
- 不是无限递归:new Main() 仅创建一个新对象,不会自动触发再次调用 main 方法。main 只由JVM显式调用一次,后续所有对象创建和方法调用均由程序员控制。
- 静态与实例的边界清晰:main 属于类级别(static),而 something() 是实例方法。因此必须先通过 new Main() 获得实例引用,才能调用非静态成员——这恰恰体现了Java严格的面向对象访问规则。
- 设计灵活性高:一个类既可以作为“启动器”(含main),也可同时作为业务模型(含属性、实例方法)。许多框架(如Spring Boot的Application类)正是这样组织的。
- 内部类需额外注意:若Main中定义了非静态内部类,则不能在main中直接 new Inner(),因为非静态内部类隐式依赖外部类实例。此时须先创建外部类对象,再通过 outer.new Inner() 方式构造(详见后文示例):
public class Main {
public static void main(String[] args) {
// ❌ 错误:无法直接 new Inner()
// Inner inner = new Inner();
// ✅ 正确:先有外部实例
Main outer = new Main();
Inner inner = outer.new Inner();
}
class Inner { // 非静态内部类
void greet() { System.out.println("Hi from Inner!"); }
}
}
✅ 总结:在main中创建本类对象是Java语言规范支持、工程实践中广泛采用的惯用模式。它标志着从“静态引导阶段”向“真正面向对象运行时”的平滑过渡。只要避免在构造器或实例初始化块中无条件递归创建自身(如 this.new Main()),就绝不存在隐式循环风险。把main看作程序世界的“登录大厅”,而new Main()则是你为自己创建的第一个可用角色——这不仅合理,而且必要。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










