java中三者执行顺序为:静态代码块→构造代码块→构造方法;含继承时为父static→子static→父init→父ctor→子init→子ctor,静态部分仅首次加载执行一次,后两者每次new均执行。

Java 中这三者的执行顺序非常明确,核心逻辑由 JVM 类加载和对象实例化两个阶段决定。
单个类的执行顺序
当首次使用一个类(比如 new 该类对象或访问其静态成员)时,JVM 加载类并按以下顺序执行:
- 静态代码块:类加载时执行一次,优先级最高;多个静态代码块按定义顺序依次执行。
- 构造代码块:每次创建对象时执行,在构造方法之前;多个构造代码块也按定义顺序执行。
- 构造方法:在构造代码块之后执行,完成对象状态的最终初始化。
含继承关系的完整顺序
创建子类对象时,JVM 先确保父类已加载、再完成子类加载,然后逐层实例化。执行顺序为:
- 父类静态代码块
- 子类静态代码块
- 父类构造代码块
- 父类构造方法
- 子类构造代码块
- 子类构造方法
注意:静态部分只在类首次加载时触发;而构造代码块和构造方法每次 new 都会执行。
关键细节与常见误区
这些点直接影响代码行为,容易被忽略:
- 静态代码块不能访问非静态成员(包括普通变量、this、实例方法)。
- 构造代码块可访问静态和非静态成员,是统一初始化对象共性逻辑的理想位置。
- 静态变量初始化语句(如 static int x = 5;)与静态代码块同属“静态初始化”,按出现顺序混合执行。
- 普通变量初始化(如 int y = 10;)与构造代码块同属“实例初始化”,也按声明顺序执行,且都在构造方法调用前完成。
为什么这个顺序重要
它决定了资源准备、依赖注入、日志记录等关键逻辑的时机。例如:
- 数据库连接池初始化适合放在静态代码块中(只需一次)。
- 每个对象的默认属性设置、计数器自增适合放在构造代码块中。
- 需要参数校验或外部依赖注入的操作,应放在构造方法中(此时对象已具备完整上下文)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











