在Java中,构造方法内可用this(...)调用本类其他重载构造器,但必须是首条语句、仅一次、不可与super(...)共存,且参数需精确匹配;其本质是构造器链,用于复用初始化逻辑。

在 Java 中,构造方法里可以用 this(...) 调用本类的其他重载构造器,但有严格限制:必须是构造方法的第一条语句,且只能调用一次。
调用规则和注意事项
使用 this(...) 的核心目的是复用构造逻辑,避免重复代码。但它不是普通方法调用,而是构造器链的起点。
- 必须出现在构造方法的第一行,否则编译报错
- 不能在 static 上下文(如静态方法、静态块)中使用
- 不能和
super(...)同时出现 —— 二者都要求第一行,互斥 - 参数类型和个数需匹配被调用构造器的签名,否则编译失败
典型使用场景
常见于多个构造器存在公共初始化逻辑时,把最完整的构造器作为“主构造器”,其余通过 this 委托给它。
例如:
立即学习“Java免费学习笔记(深入)”;
public class Person {
private String name;
private int age;
private String id;
// 主构造器(含全部参数)
public Person(String name, int age, String id) {
this.name = name;
this.age = age;
this.id = id;
}
// 重载:只传 name 和 age,id 自动生成
public Person(String name, int age) {
this(name, age, "P" + System.currentTimeMillis()); // 调用主构造器
}
// 重载:只传 name,其他设默认值
public Person(String name) {
this(name, 0); // 再次委托,最终落到三参数构造器
}
}
常见错误示例
以下写法均不合法:
-
this(...)写在赋值语句之后 → 编译错误:“call to this must be first statement” - 在一个构造器里写两次
this(...)→ 编译错误:“recursive constructor invocation” - 在普通方法里写
this(...)→ 编译错误:“not a valid statement” - 参数不匹配导致无法解析重载版本 → 编译错误:“constructor not found”
与 super(...) 的关系
每个构造器最终都必须调用父类构造器(显式 super(...) 或隐式无参 super())。当使用 this(...) 时,被调用的构造器负责完成父类初始化,当前构造器不再也不能再写 super(...)。
换句话说:this(...) 是构造器之间的跳转,而最终链条末端的那个构造器,必须承担起调用 super(...) 的责任。


















