Java中构造函数通过this()调用本类其他构造方法时,必须是首条语句、仅限构造函数内、不可与super()共存、禁止循环调用,以确保对象字段被明确初始化。

在 Java 中,一个构造函数可以通过 this() 语句调用本类中其他重载的构造方法,但必须放在第一行,且只能调用一次。
调用规则必须遵守
使用 this() 调用重载构造器时,有几条硬性限制:
- 必须是构造函数的第一条语句
- 不能在普通方法或静态上下文中使用
- 不能和 super() 同时出现(二者都需放在首行)
- 不能形成循环调用(比如 A 调 B,B 又调 A)
典型写法示例
假设有一个 Person 类,希望用不同参数灵活初始化:
public class Person {
private String name;
private int age;
// 主构造器(完整参数)
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 重载:只传 name,默认 age=0
public Person(String name) {
this(name, 0); // ✅ 调用上面两参数构造器
}
// 重载:无参构造器,默认 name="unknown", age=0
public Person() {
this("unknown"); // ✅ 先调单参构造器,间接完成初始化
}
}
常见错误提醒
以下写法都会编译失败:
立即学习“Java免费学习笔记(深入)”;
-
this(...)写在第二行 —— 编译报错:“call to this must be first statement” - 在 setter 方法里写
this(...)—— 不允许,仅限构造函数内 - 构造器里同时写
this(...)和super(...)—— 冲突,只能选其一 - 两个构造器互相调用 —— 导致栈溢出或编译拒绝
为什么设计成这样?
Java 强制把构造链起点统一管理,确保对象在真正开始执行业务逻辑前,所有字段都被明确初始化。把 this() 放首行,相当于声明“我委托别人来帮我初始化”,避免字段处于未定义状态。


















