You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java构造方法链中调用this()时super()的调用时机探究

Java构造方法调用this()时,super()的执行位置

答案很明确:super()是在构造方法链的最后一个未调用this()的构造方法中执行(如果没有显式编写super调用的话,编译器会自动插入到该构造方法的第一行)。

为什么你的示例无法区分?

你给出的示例中,两种假设的执行顺序最终输出一致:

  • 假设Option1(B()中插入super()):执行顺序是super()(打印A) → this(1) → B(int)的代码(打印B1) → B()剩余代码(打印B0),输出"A B1 B0"。
  • 假设Option2(B(int)中插入super()):执行顺序是B()调用this(1) → B(int)的第一行自动插入super()(打印A) → B(int)的代码(打印B1) → 回到B()执行剩余代码(打印B0),输出也是"A B1 B0"。

所以这个示例的输出无法区分super()的实际插入位置,需要调整代码来验证。

验证示例

修改代码,给父类A增加带参构造方法,并在B的带参构造中显式调用带参super:

public class A {
    public A(){
       System.out.print("A无参 ");
    }
    public A(String msg){
       System.out.print("A带参 ");
    }
}
public class B extends A {
 public B(){
       this(1);
       System.out.print("B0 ");
    }
 public B(int i){
       super("test"); // 显式调用父类带参构造
       System.out.print("B1 ");
    }
}

当执行new B()时,输出为**"A带参 B1 B0"**。

如果super()是在B()中执行,那会先调用A的无参构造,输出应该是"A无参 B1 B0",但实际输出是带参的结果,这就证明了super()是在最后一个未调用this()的构造方法(也就是B(int))中执行的。

核心规则

Java的构造方法执行遵循以下链式规则:

  • 任何构造方法,如果既没有显式调用super(...),也没有显式调用this(...),编译器会自动在该构造方法的第一行插入super()(调用父类无参构造)。
  • 如果构造方法调用了this(...),那么它不会处理super调用,而是把这个责任转交给被调用的构造方法,直到构造链的终点——那个没有调用this(...)的构造方法,由它来完成super的调用(不管是显式还是编译器自动插入)。

内容的提问来源于stack exchange,提问作者Avery

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:50:25