执行顺序为:父类静态代码块→子类静态代码块→父类构造代码块→父类构造方法→子类构造代码块→子类构造方法;静态代码块仅类加载时执行一次,构造代码块每次创建对象时执行且先于构造方法。

构造代码块(实例代码块)在每次创建对象时执行,且先于构造方法;静态代码块只在类加载时执行一次,早于任何对象的创建。
静态代码块最先执行(仅一次)
静态代码块属于类级别,由 JVM 在类首次被主动使用(如 new 实例、访问静态成员、反射等)而加载类时执行,且只执行一次。它不依赖对象,因此在任何构造代码块或构造方法之前运行。
- 即使创建多个对象,静态代码块也只执行一次
- 若子类继承父类,父类静态代码块先于子类静态代码块执行
构造代码块次之(每次 new 都执行)
构造代码块(即用 { ... } 定义、不在任何方法或静态修饰内的代码块)属于实例级别。每次调用构造方法前,JVM 会先将构造代码块中的内容“插入”到每个构造方法的开头(编译期处理),因此它总在构造方法体执行之前运行。
- 多个构造代码块按它们在类中出现的顺序依次执行
- 父类的构造代码块在子类的构造代码块之前执行(因父类构造方法先被调用)
构造方法最后执行(每次 new 都执行)
构造方法在构造代码块之后运行,完成对象的初始化逻辑。若存在显式或隐式的 super() 或 this() 调用,会先触发对应父类或本类其他构造方法的执行流程(含其静态块→构造块→构造方法),再继续当前构造方法剩余部分。
- 子类构造方法默认第一行是 super()(除非显式写了 this(...) 或 super(...))
- 因此完整顺序为:父类静态块 → 子类静态块 → 父类构造块 → 父类构造方法 → 子类构造块 → 子类构造方法
理解这个顺序的关键在于区分“类加载时机”和“实例化时机”,静态代码块属于前者,构造代码块和构造方法属于后者,且后者内部还有父子类的调用链约束。不复杂但容易忽略。










