this(...)必须是构造函数首句且仅一次,执行时先完成整个构造函数链(至链尾),再执行链尾构造函数体;字段初始化和实例块仅在链尾构造函数前执行一次。

在 Java 构造函数中用 this(...) 调用本类其他构造函数,必须是该构造函数的第一条语句,且只能出现一次。它的执行顺序是:先执行被调用的构造函数体(包括其中的 this(...) 链),再继续执行当前构造函数中 this(...) 之后的代码(如果有的话)——但注意,由于 this(...) 必须是首句,所以“之后的代码”实际属于被调用的那个构造函数。
构造函数链的执行顺序
Java 中通过 this(...) 形成的构造函数调用链,是从当前构造函数开始,逐级向上(或向其他重载构造函数)跳转,直到某个构造函数不再调用 this(...)(即“链尾”),才真正开始初始化对象:
- 编译器强制要求
this(...)必须是构造函数的第一行,否则编译失败 - 整个链中只有一个构造函数能调用
super(...)(显式或隐式),且必须是链尾的那一个;其余构造函数的super(...)调用会被禁止(即使没写,隐式super()也会被禁止) - 字段初始化(如
int x = 10;)和实例初始化块,在每个构造函数执行体开始前、按声明顺序执行——但仅对最终到达的链尾构造函数生效一次 - 例如:
A(int i) { this(); ... }→ 先跳到A() { ... },A()执行完后,A(int)中this()后面的语句才执行(如果有)
this(...) 和 super(...) 不能共存
同一个构造函数里不能同时出现 this(...) 和 super(...),因为两者都必须是第一句。JVM 只允许一次父类构造器调用,且必须由链尾的构造函数完成:
- 如果你写了
this(...),那么链尾构造函数必须负责调用super(...)(显式或靠默认隐式super()) - 如果链尾构造函数没写
super(...),且父类没有无参构造器,就会编译失败 - 错误示例:
A() { this(1); super(); }—— 编译不通过,super()写在第二行
字段初始化时机要特别注意
实例变量的直接赋值(如 private String name = "default";)和实例初始化块,不是在每个构造函数里重复执行,而是在进入链尾构造函数前统一执行一次:
立即学习“Java免费学习笔记(深入)”;
- 执行顺序是:分配内存 → 执行父类构造器(
super)→ 执行本类字段初始化和实例块 → 执行链尾构造函数体 - 也就是说,无论你从哪个构造函数进入,字段初始化只发生一次,且在链尾构造函数体执行之前
- 常见误区:以为
this(...)跳转后字段会重新初始化 —— 不会,它只初始化一次
典型执行流程示例
假设类定义如下:
class Example {
{ System.out.println("实例块"); }
private String s = initS(); // 字段初始化
Example() {
System.out.println("无参构造");
}
Example(int i) {
this(); // 调用无参构造
System.out.println("有参构造后续");
}
private String initS() {
System.out.println("initS()");
return "s";
}
}
调用 new Example(1) 的实际输出顺序是:
initS()实例块无参构造有参构造后续
这说明字段初始化和实例块在 this() 跳转前已完成,然后才进入链尾(Example()),最后执行 Example(int) 中 this() 后的语句。


















