Java在类未显式定义任何构造方法时,自动添加一个无参、public、方法体为空且隐式调用super()的默认构造器;一旦定义任一构造方法,该默认构造器即消失。

Class中的constructor不是必须显式写的,但每个类一定有至少一个构造函数——哪怕你一个都没写,Java也会悄悄补上一个默认的无参构造器。
不写constructor时,Java自动给什么?
当你定义一个类却完全没写任何构造方法,编译器会自动生成一个**无参数、方法体为空、访问权限为public**的默认构造器。例如:
class Person { } 等价于:
class Person { public Person() {} }
这个默认构造器只做一件事:调用父类的无参构造器(通过隐式的 super())。如果父类没有无参构造器,而子类又没写任何构造器,编译就会报错。
写了constructor之后,默认构造器就没了
一旦你手动写了任意一个构造方法(哪怕只有一个带参数的),Java就**不再生成默认无参构造器**。比如:
- class Car { Car(String brand) { this.brand = brand; } }
- 此时 new Car() 编译失败,因为已不存在无参构造器
- 若需支持无参创建,就得自己补上:Car() {}
constructor怎么完成初始化?
构造器的核心任务是给对象的成员变量赋初值,常见方式有三种:
- 直接赋值:在构造器体内写 this.name = name;
- 调用this()复用其他构造器:实现重载构造器间的逻辑共享,必须是第一行语句
- 委托父类构造器:用 super(...) 显式调用父类构造器,也必须是第一行;不写则默认调用 super()
注意:成员变量的初始化表达式(如 private String id = "001";)会在构造器执行前先运行,但实际赋值顺序仍是“父类字段 → 父类构造器 → 子类字段 → 子类构造器”。
为什么建议保留无参构造器?
很多框架(如Spring、MyBatis、Jackson)依赖无参构造器来反射创建对象。如果你只写了带参构造器又没留无参的,这些场景可能直接抛异常。
稳妥做法是:即使业务上不需要无参创建,也显式写一个空的 public ClassName() {},避免隐式规则带来的兼容问题。

















