Java类初始化顺序为:先静态后实例、先父类后子类、同级按代码自上而下执行;静态部分仅首次触发时执行一次,实例部分每次new均执行。

可以通过在类的各个初始化位置添加日志输出,观察控制台打印顺序来验证 Java 类的初始化顺序。
静态成员与静态代码块的执行时机
静态变量初始化和静态代码块在类首次被主动使用(如创建实例、访问静态成员、反射加载等)时执行,且只执行一次。它们按在类中出现的**自上而下顺序**执行,与是否是变量声明还是 static {} 无关。
验证方法:在类中定义多个静态变量并赋值,穿插静态代码块,每个赋值或块里加 System.out.println("static X");然后在 main 中仅通过 Class.forName("Xxx") 或访问任一静态字段触发初始化,观察输出顺序。
实例成员与普通代码块的执行时机
每次 new 对象时,先执行父类再到子类的以下步骤:父类静态 → 子类静态 → 父类普通代码块 → 父类构造器 → 子类普通代码块 → 子类构造器。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
普通代码块(即未加 static 的 { ... })和实例变量初始化,按源码顺序执行,位于构造器调用之前。它们属于对象创建流程的一部分,不是类加载阶段的内容。
- 实例变量赋值语句和普通代码块混合写时,谁在上面就先执行谁
- 构造器第一行若为
super(...)或this(...),则父类/本类的上述实例部分会在进入当前构造器主体前完成
继承关系下的完整初始化链条
验证多级继承时的顺序,需准备三层类(A → B → C),每层都包含静态变量、静态块、实例变量、普通块、构造器,并全部加入打印语句。main 中执行 new C(),输出将清晰展示:
- A 的静态部分(变量 + 块)
- B 的静态部分
- C 的静态部分
- A 的实例部分(变量 + 块)→ A 构造器
- B 的实例部分 → B 构造器
- C 的实例部分 → C 构造器
注意易混淆点
静态内容只在类第一次初始化时运行,后续 new 多个对象不会重复执行静态块;而每次 new 都会完整走一遍实例部分。另外,接口没有静态代码块,其 static final 字段在首次访问时初始化(类似类,但无“静态块”概念);枚举类的初始化也遵循类似规则,但其常量实例在静态阶段就已完成创建。

















