Java对象初始化顺序为“类加载→静态成员初始化→实例成员初始化→构造方法”,继承时遵循“静态优先于实例、父类优先于子类”:先父类静态变量与静态块,再子类静态变量与静态块;然后父类实例变量、构造块、构造方法,最后子类实例变量、构造块、构造方法。

Java 对象初始化顺序严格遵循“类加载 → 静态成员初始化(含静态块)→ 实例成员初始化(含构造块)→ 构造方法”的执行链条。这个顺序在继承场景下还会叠加父类到子类的层级展开,容易出错,但只要抓住“静态优先于实例、父类优先于子类”两条主线,就能理清逻辑。
类加载阶段:触发静态初始化
当 JVM 第一次主动使用某个类(如 new 实例、调用静态方法、访问静态字段等),会触发该类的加载、链接和初始化。此时仅执行静态变量赋值和静态代码块,且只执行一次,与对象创建无关。
- 静态变量按声明顺序初始化,遇到静态代码块则立即执行
- 若存在继承,先初始化父类静态部分,再初始化子类静态部分
- 静态内容不依赖对象,即使没 new 任何实例,只要类被主动引用就会触发
创建对象时:实例初始化三步走
执行 new 表达式时,在堆中分配内存后,按以下顺序完成实例初始化:
- 父类构造器调用链起点:子类构造方法第一行默认或显式调用 super(),进入父类构造流程
- 父类实例成员初始化:按声明顺序执行父类的非静态字段赋值 + 构造块(即 {} 块)
- 父类构造方法体执行;完成后回到子类,同样顺序执行子类的实例字段赋值、构造块、构造方法体
注意:构造块({})和字段初始化语句地位等同,都属于“实例初始化器”,编译后会被合并进每个构造方法的开头(super() 调用之后)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
完整执行顺序示例(含继承)
假设 class A(父类)→ class B(子类),执行 new B() 时实际顺序为:
- A 的静态变量赋值
- A 的静态代码块
- B 的静态变量赋值
- B 的静态代码块
- A 的实例变量赋值
- A 的构造块
- A 的构造方法
- B 的实例变量赋值
- B 的构造块
- B 的构造方法
常见陷阱提醒
静态方法中不能直接访问非静态成员——因为静态上下文可能在任何对象创建前就已运行;构造块里调用被子类重写的方法,可能因子类字段尚未初始化导致 NPE;在静态字段初始化时 new 当前类实例,会触发类初始化未完成就递归调用,引发 ExceptionInInitializerError。
理解这个顺序不是为了死记,而是为了写出可预测的初始化逻辑,尤其在单例、工具类、配置加载等场景中避免隐式依赖和时序 bug。

















