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
相关产品推荐
相关产品推荐

