java构造方法链中this()调用是值传递,参数在调用前求值并复制给目标构造器形参;this(...)必须为首条语句;重载解析按类型精确匹配;对象引用传递的是引用副本。

Java 中构造方法链通过 this 调用另一个构造器时,参数值是按实参表达式求值后、以“值传递”方式传入目标构造器的——和普通方法调用一样,不是引用传递,也不是延迟绑定。
参数在 this() 调用前就已完成计算
this(...) 必须是构造器的第一条语句,JVM 会先执行括号内所有实参表达式(包括变量读取、方法调用、运算等),得到具体值,再将这些值复制给目标构造器的形参。
例如:
public class Person {
public Person(String name) {
this(name, 0); // name 的值(如 "Alice")在此刻确定并传入
}
public Person(String name, int age) {
System.out.println("Name: " + name + ", Age: " + age);
}
}
即使 name 是一个可变变量,this(name, 0) 传入的是它当时的值,后续修改不影响已传入的目标构造器。
this() 不能出现在普通代码块或条件分支中
因为参数传递依赖编译期确定的调用路径,JVM 要求 this(...) 必须作为首行显式出现,确保参数求值时机唯一且可控。
以下写法非法:
-
if (x > 0) this("valid");—— 编译报错,this() 不在第一行 -
String s = getName(); this(s);—— 编译报错,this() 前有其他语句
参数类型匹配遵循重载解析规则
编译器根据实参类型、个数和可转换性,选择最具体的匹配构造器。自动类型提升(如 int → long)、装箱(int → Integer)、泛型擦除后匹配都参与决策。
例如:
public class Box {
public Box(int x) { /* ... */ }
public Box(Object o) { /* ... */ }
public Box(int x, int y) { this(x); } // 调用 Box(int),不是 Box(Object)
}
这里 this(x) 明确匹配 Box(int),因为它是更精确的重载候选。
注意:this() 传递的是值,不是变量本身
对对象引用类型,传递的是引用的副本(即指向同一对象的另一个引用),但该引用变量本身不可被目标构造器修改影响原变量。
举例:
String s = "old"; this(s); // 传入的是 "old" 这个字符串对象的引用副本 s = "new"; // 不影响已传入构造器中的 s 形参值
目标构造器内部对形参重新赋值(如 name = "new"),只改变其局部引用,不改变调用方的原始变量。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











