java类初始化顺序为:父类静态→子类静态→父类实例→父类构造→子类实例→子类构造;静态部分仅执行一次,实例部分每次new均触发,且父类构造器先于子类完成。

Java 类加载初始化时,父子类执行顺序由 JVM 的类加载机制和对象创建流程分层决定,不是简单按代码位置排列,而是有严格层级与时机约束。
静态部分:父类先于子类,且只执行一次
当某个类首次被主动使用(如 new 子类()、调用子类静态方法、访问子类 public static 字段等),JVM 会沿继承链向上检查并强制完成所有祖先类的静态初始化:
- 先为最顶层父类(如 Object)分配类元数据,执行其静态变量显式赋值(如 static int x = 10;)和静态代码块,按源码从上到下顺序
- 再依次向下执行直接父类、间接父类的静态部分
- 最后执行子类自身的静态变量赋值和静态代码块
- 整个过程每个类的静态内容仅触发一次;后续再 new 多少对象、调用多少次静态方法,都不会重复执行
实例部分:每次 new 都走完整父→子链路
静态初始化完成后,才开始真正创建对象。此时 JVM 为整个对象(含父类和子类字段)一次性分配内存,并将所有字段设为默认值(0、null、false)。接着按如下顺序执行:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 执行父类的实例变量赋值(如 String name = "A";)和实例代码块({ ... }),按源码顺序
- 调用父类构造器(隐式或显式 super() 是入口开关)
- 父类构造器内部,同样先处理完自己的实例块和字段,再执行构造函数体
- 父类构造器返回后,才执行子类的实例变量赋值、实例代码块
- 最后执行子类构造器体
关键细节不能忽略
有些行为看似反直觉,但有明确规范支撑:
- 父类构造器中调用的方法,若被子类重写,实际执行的是子类版本——但此时子类的实例字段还未初始化(仍为默认值),容易引发空指针或逻辑异常
- 静态块中不能前向引用其后声明的静态变量(编译报错),而实例块无此限制
- final static 基本类型常量(如 public static final int MAX = 100;)属于编译期常量,不触发类初始化
- 类加载器只参与静态初始化阶段;对象创建阶段不涉及类加载器
怎么验证这个顺序
最可靠的方式是在各处插入日志输出:
- 每个静态块加 System.out.println("Parent static block");
- 每个实例块和构造器第一行加对应日志
- 运行 new Child(),观察输出是否符合:父静 → 子静 → 父实 → 父构 → 子实 → 子构
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










