java中构造方法用this调用另一构造方法时,必须是首条语句且仅限本类,参数可为字面量、已初始化变量、合法表达式或this.xxx字段;禁止非首行调用、未初始化字段引用、递归调用或普通方法中使用。

Java 中构造方法使用 this 调用另一个构造方法时,参数传递方式和普通方法调用类似,但有严格限制:必须是构造方法的第一条语句,且只能调用本类的其他构造方法。
语法格式与基本规则
this(...) 是显式调用本类其他构造方法的关键字,括号内填写对应构造方法所需的实参。这些实参可以是:
- 字面量(如
"abc"、100) - 已有变量或字段(需在调用前已定义并初始化)
- 表达式(如
str.toUpperCase()、a + b),只要类型匹配且无副作用即可 - 其他构造方法中可访问的
this.xxx字段(注意:不能在字段初始化之前使用)
常见合法传参示例
假设有一个 Person 类:
public class Person {
private String name;
private int age;
// 主构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 用 this 调用主构造,传入默认值
public Person(String name) {
this(name, 0); // ✅ 合法:传字符串和整数字面量
}
// 用 this 调用并组合参数
public Person() {
this("Unknown", calculateDefaultAge()); // ✅ 合法:调用静态方法提供参数
}
private static int calculateDefaultAge() {
return 18;
}
}
不允许的操作与典型错误
以下写法会导致编译错误:
-
this();出现在非第一行(如前面有变量声明或输出语句)→ 编译失败 - 在
this(...)中引用尚未初始化的实例字段(如this.name在字段声明前使用)→ 编译失败 - 递归调用自身构造方法(如 A 构造里
this(),而this()又调回 A)→ 编译失败 - 试图在普通方法中使用
this(...)→ 编译失败(仅限构造方法内)
参数类型与重载匹配原则
编译器根据传入的实参类型、个数和顺序,匹配本类中已定义的构造方法签名。如果存在多个可能匹配项,会按最精确匹配原则选择;若无法唯一确定,将报错。
例如:
public Person(String name) { ... }
public Person(Object obj) { ... }
// 在另一个构造中写 this(new Date()) → 匹配 Object 版本
// 写 this("Alice") → 精确匹配 String 版本
传参本质就是为被调用构造方法提供它期望的输入,关键在于满足签名一致性和调用位置约束。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











