this()用于委托本类其他构造器初始化,必须首行、唯一、不与super()共存,参数需严格匹配,推荐以全参构造器为统一入口集中校验逻辑。

Java构造器里的this()不是“调用自己”,而是把初始化任务交给本类另一个构造器,核心目标是避免重复写字段赋值、校验或默认值逻辑。
必须放在第一行
编译器强制要求this()是构造方法里第一条可执行语句。哪怕前面只加一个变量声明或注释,都会报错“Constructor call must be first statement”。
- ✅ 正确:
this("张三", 25);(单独一行,开头) - ❌ 错误:
String tmp = "test"; this("张三", 25);(有前置语句)
只能调用一次,且不能和super()共存
一个构造器里最多出现一条this(),也不能同时写super()。二者都争抢“首行位置”,语法上互斥。
- ✅ 合法链路:无参构造 →
this("默认名")→this("默认名", 0)→ 最终某个构造器隐式或显式调用super() - ❌ 编译失败:
this("a"); super();或this(); this(123);
参数必须严格匹配目标构造器签名
传给this()的实参,类型、数量、顺序必须和本类中某个构造器完全一致。自动类型提升(如int→long)可以,但不会帮你拆箱、装箱或做字符串转数字这类转换。
- ✅ 匹配:
this(10)调用public Person(int age) - ❌ 不匹配:
this("10")尝试调用Person(int age)(字符串无法自动转int) - ⚠️ 注意:
new Person(5, 5)中两个5是两个int,不是double;想传5.5就得写5.5,不能写5,5
推荐以全参构造器为统一入口
把字段校验、规范化处理(比如去空格、转小写、设默认ID)集中到一个“主构造器”里,其他构造器通过this()委托过去,能显著减少出错点和维护成本。
- 例如:
User(String name, int age)内部调用this(name, age, null, 0),所有校验逻辑只在四参构造器里写一遍 - 避免每个构造器都写
if (name == null) throw ...,分散又易漏
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











