java中子类对象创建时执行顺序为:父类静态代码块→子类静态代码块→父类非静态代码块→父类构造方法→子类非静态代码块→子类构造方法;静态部分仅首次类加载时执行一次,实例部分每次new均完整执行,且严格遵循“先父后子、先静后动”原则。

Java 中子类对象创建时,父类的静态代码块、非静态代码块和构造方法会按特定顺序执行,这个顺序由类加载机制和对象初始化流程共同决定,不是随意的。
静态代码块最先执行(只执行一次)
当 JVM 第一次加载父类(或子类)时,会执行其 static 代码块,且仅执行一次。执行顺序是:先父类 static,再子类 static(如果子类也有),与 new 对象无关,只和类首次被主动使用有关。
- 父类 static 代码块 → 子类 static 代码块(若存在)
- 即使只 new 子类对象,父类 static 块也会在子类加载前触发(因为子类继承父类,加载子类需先确保父类已加载)
非静态代码块和构造方法按继承链自上而下执行
每次 new 子类对象时,JVM 会沿着继承链从顶层父类开始,依次执行各层的 非静态代码块(实例初始化块) 和 构造方法:
- 父类非静态代码块 → 父类构造方法
- 子类非静态代码块 → 子类构造方法
- 注意:子类构造方法第一行默认隐含
super()(调用父类无参构造),这决定了父类初始化必须先完成
完整执行顺序示例(带注释)
假设有:class A(父类)、class B extends A(子类):
// 类加载阶段(首次使用时触发)
A.static { } // 先执行
B.static { } // 再执行
// new B() 时的实例初始化阶段
A { } // A 的非静态代码块
A() // A 的构造方法
B { } // B 的非静态代码块
B() // B 的构造方法
这个顺序固定,不受构造方法中 this() 或 super(...) 显式调用影响——只要没写 super(...),就默认走 super();写了 super(...),也必须是第一行,仍保证父类先初始化。
容易混淆的点
非静态代码块不是“构造方法的一部分”,而是编译器将其内容合并进每个构造方法的开头(在 super() 调用之后、构造方法体之前)。所以它总在 super() 完成后、本类构造方法体执行前运行。
- 非静态代码块执行时机 = 构造方法体执行前,但晚于 super() 调用(即父类已构造完毕)
- 多个非静态代码块按定义顺序合并执行
- 静态代码块属于类,非静态代码块属于对象,二者生命周期和触发时机完全不同
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











