java中this()调用本类构造方法必须位于首行、仅一次且不与super()共存,参数需严格匹配,调用链须终止于含super()或默认父类调用的终点构造器,禁止循环调用。

Java 中用 this() 调用本类其他构造方法,核心是复用初始化逻辑,但必须严格遵守语法规则,否则编译直接失败。
必须放在构造方法第一行
这是硬性要求,不是风格建议。哪怕前面只有一行变量声明、日志打印或空行,都会报错 “Constructor call must be the first statement”。
-
合法:
this("张三");(紧贴左大括号后) -
非法:
String tmp = "test"; this("张三"); -
非法:
System.out.println("start"); this("张三");
只能调用一次,且不能和 super() 共存
一个构造器里最多出现一条 this(),也不能同时写 super()——二者都争抢首行位置,语法上互斥。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 如果用了
this(),编译器不会自动插入super();但整个调用链最终必须抵达一个含super()(显式或隐式)的构造器,否则父类未初始化 - 常见安全链路:无参构造 → 单参构造 → 全参构造(终点构造器中含
super()或默认调用)
参数必须严格匹配目标构造器签名
实参的类型、数量、顺序必须与被调用构造器的形参完全一致。Java 在此处不支持自动装箱、拆箱、字符串转数字或 varargs 展开。
-
可以:
this(10)匹配Person(int age) -
可以:
this(10L)匹配Person(long age)(自动类型提升) -
不行:
this("10")尝试调用Person(int age)(字符串不转 int) -
不行:
this("a", "b")尝试调用Person(String... names)(varargs 不参与重载解析)
调用链必须有终点,禁止循环
所有 this() 调用最终必须导向一个不再依赖 this() 的构造器(即“终点构造器”),它负责字段赋值、校验等核心操作。
-
推荐做法:把参数最全、逻辑最完整的构造器设为终点,集中处理
final字段赋值、非空检查、数据规范化等 -
典型错误:
Person(){ this(); }或Person(){ this("A"); }+Person(String s){ this(); }→ 编译报 “Recursive constructor invocation”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










