java对象初始化顺序为:父类静态成员→父类静态块→子类静态成员→子类静态块→父类实例成员→父类实例块→父类构造器→子类实例成员→子类实例块→子类构造器;静态部分仅执行一次,实例部分每次new均执行。

Java对象初始化不是简单地执行构造器,而是一套严格有序、分阶段触发的机制。理解它,才能避免“变量为null”“静态资源未加载”等隐蔽问题。
静态代码块:类加载时只跑一次
静态代码块用 static{...} 定义,在类首次被JVM加载并初始化时执行,且仅执行一次。它适合做全局性、与具体对象无关的准备,比如数据库连接池初始化、常量加载、日志配置。
- 多个静态块按声明顺序依次执行
- 只能访问静态成员(static 字段/方法),不能用 this 或非静态变量
- 父类静态块先于子类静态块执行——哪怕你只 new 子类,父类也会被提前加载
实例初始化块:每次 new 都执行一遍
不带 static 的 {...} 是实例初始化块,它在每次调用构造器创建对象时自动运行,位置在字段显式赋值之后、构造器代码之前。
- 可用于封装多行初始化逻辑(如读配置、校验参数、捕获异常),比在每个构造器里重复写更干净
- 可访问静态和非静态成员(包括 this),因为它依附于具体对象
- 多个实例块也按声明顺序执行;父类实例块先于子类执行
初始化顺序:五步不可乱
当你写 new Child(),JVM内部实际按固定顺序推进:
- 1. 父类静态成员赋值 → 父类静态代码块
- 2. 子类静态成员赋值 → 子类静态代码块
- 3. 父类普通成员赋值 → 父类实例块
- 4. 父类构造器执行
- 5. 子类普通成员赋值 → 子类实例块 → 子类构造器
这个链条决定了为什么你在实例块里能安全使用已赋值的字段,却不能在静态块中调用实例方法。
构造器不是起点,而是终点
构造器常被误认为初始化“第一站”,其实它是整个初始化流程的收尾环节。它的核心职责是:接收外部参数、完成业务级定制、协调父类初始化(通过 super(...) 或 this(...))。
- 若没写任何构造器,编译器会补一个无参默认构造器
- 只要写了任意构造器,编译器就不再自动生成默认构造器
- super() 调用必须是构造器第一行(显式或隐式),否则编译报错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











