this()用于构造方法链式调用,所有构造器必须委托给唯一主构造器执行初始化、校验等核心逻辑,且this()必须为首行语句,禁止与super()共存或形成循环调用。

用 this() 把多个构造方法串起来,核心就一条:让所有构造逻辑最终落到同一个“主构造器”里执行,避免字段赋值、校验、默认处理重复写。
主构造器定规则,其他构造器只委托
选一个参数最全的构造方法作为主构造器,它负责全部字段初始化、合法性校验、数据规范化等关键操作。其余构造器不自己干活,只通过 this() 把参数补全后交给它。
- 比如
User(String name, int age, String email, long id)是主构造器,做非空检查、trim、年龄下限限制、ID自动生成等 -
User(String name, int age)就写成this(name, age, null, 0) -
User(String name)写成this(name, 0),间接复用两层
调用必须放在第一行,且不能和 super() 并存
this() 不是普通语句,是编译器强制识别的构造链起点。一旦写了,就必须是构造方法里的第一个动作。
- 写在第二行?编译报错:"Constructor call must be the first statement"
- 已在首行写了
super(...),再加this(...)?直接编译失败 - 子类中用了
this(),父类初始化仍会发生——因为最终某个构造器(可能是链末端那个)会隐式或显式调用super()
支持链式调用,但严禁循环
构造器之间可以 A → B → C 这样逐级委托,只要整条链最终抵达一个不依赖 this() 的构造器即可。
立即学习“Java免费学习笔记(深入)”;
- ✅ 正确:无参构造 → 单参构造 → 全参构造
- ❌ 错误:
Person(){ this(); }或Person(){ this("A"); }+Person(String s){ this(); } - IDE 通常高亮提示,编译时报 "Recursive constructor invocation"
默认值封装要靠 this() 向上靠拢
不同构造器提供的默认值不是各自硬编码,而是统一由主构造器决定。其他构造器只负责把缺失参数替换成约定好的默认值,再传过去。
- 例如邮箱默认为
"unknown@example.com",就写this(name, age, "unknown@example.com", System.nanoTime()) - 避免在
User(String name)里写一遍this.email = "unknown@example.com",又在User(String name, int age)里再写一遍 - 这样改默认值只需动主构造器一处,所有路径自动同步


















