this()调用必须位于构造方法首行,且与super()互斥;参数需精确匹配或标准类型提升,不支持自动装箱拆箱、varargs;禁止递归调用,编译期强制检查。

构造方法里调用this()必须是第一行
Java规定,如果在一个构造方法里用this()调用本类其他构造方法,它必须是该方法体内的第一条可执行语句。否则编译直接报错:Constructor call must be the first statement in a constructor。
这是因为JVM需要在对象内存分配后、字段初始化前,就确定到底走哪条构造路径——this()本质是把控制权转给另一个构造器,不能等局部变量、if判断甚至super()之后再决定。
- ✅ 正确写法:
this("default");紧贴左大括号后换行 - ❌ 错误写法:
System.out.println("before"); this("default");→ 编译失败 - ❌ 错误写法:
super(); this("default");→ 二者互斥,只能选一个且super()或this()必须为首句
this()和super()不能同时出现
同一个构造方法里,this()和super()是互斥的。因为两者都要求出现在首行,而首行只能有一条语句。
常见误解是“先调父类再调本类”,但Java不支持这种链式委托。你得明确选择:要么通过this()复用本类其他构造逻辑(此时隐式调用super()),要么显式调super()并自己处理所有初始化。
立即学习“Java免费学习笔记(深入)”;
- 用
this()时,目标构造方法内部仍会触发父类构造(除非它自己也用了this(),最终某条链上必有super()) - 如果父类没有无参构造,而你又用了
this(),那被调用的构造方法里必须显式写super(...),否则编译报错 - 错误示例:
this(123); super("x");→ 直接语法错误
参数匹配要严格,不自动装箱/拆箱
this()调用时的实参类型,必须能被目标构造方法的形参列表**精确匹配或通过标准类型提升匹配**,但不会触发自动装箱、拆箱、varargs展开或隐式转型(如int→Integer不行)。
比如目标构造方法是public Foo(Integer x),你写this(42)会失败,因为int字面量不能自动转成Integer来匹配this()调用。
- ✅
this(42)可匹配Foo(int x) - ✅
this(42L)可匹配Foo(long x) - ❌
this(42)无法匹配Foo(Integer x)(编译错误) - ❌
this("a", "b")无法匹配Foo(String... args)(varargs不参与this()重载解析)
递归调用this()会导致编译报错
Java编译器会做静态检查,禁止任何可能形成构造方法循环调用的路径。哪怕中间隔了好几层,只要存在闭环,就拒绝编译。
例如A调B,B调C,C又调回A——这种间接递归也会被检测出来,报错:Recursive constructor invocation。
- 这是编译期强制约束,不是运行时异常
- 即使条件分支看似不会执行(如
if (false) this();),只要语法上存在调用,仍会报错 - 调试时如果看到这个错,别查逻辑,直接翻构造方法之间的调用图,找闭环








