this()用于同一类构造器间链式调用,必须为首条语句、仅一次、不可在条件块中,参数须严格匹配,不能与super()共存,且被调用构造器不可再调用this()。

Java 中构造器链式调用里的 this,是用来在同一个类的不同构造器之间互相调用的,必须是构造器的第一条语句,且只能调用一次。
this() 必须放在第一行
如果一个构造器想调用本类的另一个构造器,必须用 this(参数),而且它必须是该构造器中唯一允许出现在第一行的语句。编译器会强制检查这一点,否则直接报错。
- 不能写在条件分支里(比如 if 或 try 块内)
- 不能和变量声明、打印语句等混在一起
- 不能出现多次 —— 一个构造器最多调用一次其他构造器
只能调用本类的其他构造器
this(...) 只能调用当前类已定义的构造器,不能调用父类构造器(那是 super(...) 的职责)。如果本类没有匹配参数的构造器,编译失败。
- 参数类型、数量、顺序必须严格匹配某个已有构造器签名
- 不支持自动装箱/拆箱或隐式类型转换来“凑”匹配(除非符合 Java 方法重载规则)
- 常见错误:写成
this.x = ...(这是普通字段赋值),混淆了this()和this.字段
典型用法:简化重载构造器逻辑
常用于把多个构造器的公共初始化逻辑集中到一个“主构造器”,其他构造器通过 this(...) 委托过去,避免重复代码。
- 例如:一个类有无参、单参、双参构造器,可以把所有字段初始化逻辑放在双参构造器里,其余构造器都调用它
- 注意:被调用的主构造器本身不能再用
this(...),否则形成循环调用,编译不通过 - 字段赋值应该放在被调用的那个构造器里,而不是调用方
和 super() 不能共存
每个构造器要么以 this(...) 开头,要么以 super(...) 开头(显式或隐式),二者互斥。因为 JVM 要求构造器执行前必须确定对象的继承链起点。
- 没写
this也没写super→ 编译器自动插入super() - 写了
this(...)→ 不再插入super(),由被调用的构造器负责父类初始化 - 同时写
this(...)和super(...)→ 编译错误
掌握 this() 的位置、限制和协作逻辑,构造器链就清晰可控。不复杂但容易忽略细节。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











