构造方法执行顺序为:父类静态代码块→子类静态代码块→父类实例初始化块→父类构造方法→子类实例初始化块→子类构造方法,且super()必须位于子类构造方法首行。

Java构造方法的执行顺序涉及继承关系中父类与子类的初始化过程,理解这一流程对掌握对象创建机制非常重要。当创建一个子类对象时,JVM会自动确保父类被优先初始化,整个过程遵循明确的顺序,并伴随一些关键注意事项。
构造方法的执行顺序
在存在继承关系的情况下,构造方法的调用顺序如下:
- 父类静态代码块:最先执行,仅在类加载时运行一次。
- 子类静态代码块:父类之后执行,同样只执行一次。
- 父类实例初始化块:每次创建对象时,在构造方法前执行。
- 父类构造方法:通过 super() 调用,完成父类字段初始化。
- 子类实例初始化块:进入子类后,先于子类构造方法执行。
- 子类构造方法:最后执行,完成子类自身的初始化。
示例说明:
class Parent {
static { System.out.println("1. 父类静态代码块"); }
{ System.out.println("3. 父类实例初始化块"); }
public Parent() {
System.out.println("4. 父类构造方法");
}
}
class Child extends Parent {
static { System.out.println("2. 子类静态代码块"); }
{ System.out.println("5. 子类实例初始化块"); }
public Child() {
System.out.println("6. 子类构造方法");
}
}
// 测试
new Child();
输出结果为:
1. 父类静态代码块
2. 子类静态代码块
3. 父类实例初始化块
4. 父类构造方法
5. 子类实例初始化块
6. 子类构造方法
super() 的隐式与显式调用
每个子类构造方法的第一条语句必须是调用父类构造方法(即 super()),如果未显式写出,编译器会自动插入 super(),表示调用父类无参构造方法。
立即学习“Java免费学习笔记(深入)”;
- 若父类没有无参构造方法,必须显式使用 super(参数) 调用匹配的构造方法。
- 否则编译失败,提示“无法找到合适的构造方法”。
例如:
class Animal {
public Animal(String name) { ... }
}
class Dog extends Animal {
public Dog() {
super("dog"); // 必须显式调用
}
}
构造方法中的注意事项
- 避免在构造方法中调用可被重写的方法:若子类重写了该方法,可能导致子类方法在父类构造完成前被调用,引发空指针或状态不一致问题。
- 构造方法不能被继承或重写:子类不会继承父类的构造方法,但可通过 super 调用。
- 构造方法可以重载:同一个类中允许定义多个参数不同的构造方法。
- 私有构造方法限制实例化:常用于单例模式或工具类,防止外部创建对象。
- 构造链需合理设计:多个构造方法之间可用 this() 相互调用,但只能调用一次且必须位于首行。
常见错误与规避建议
- 忘记为父类提供无参构造方法,导致子类编译失败——建议显式定义或添加 super 调用。
- 在构造方法中暴露 this 引用(如注册监听器)——可能使对象在未完全初始化时被外部访问。
- 过度复杂化构造逻辑——应尽量保持构造方法简洁,复杂初始化可移至 init 方法。
基本上就这些。只要记住“静态先于实例,父类先于子类,super() 必须最先处理”,就能清晰把握 Java 构造方法的执行流程和关键细节。










