Java中代码块执行顺序由JVM严格保证:静态代码块在类首次主动使用时执行一次;构造代码块每次new时执行,位于构造方法体前;普通代码块仅限方法内作用域隔离;继承时按父静态→子静态→父实例→父构造→子实例→子构造顺序执行。

Java 中代码块执行顺序不是靠经验判断,而是由 JVM 严格保证的运行时机制。写对位置、用对时机,才能让初始化逻辑清晰、可预测、易维护。
静态代码块:只跑一次,必须最先完成
它在类首次被主动使用(如 new、调用静态方法、访问静态字段)时触发,且仅执行一次。适合放全局性、一次性动作:
- 加载 JDBC 驱动、初始化连接池、读取配置文件
- 预热缓存、注册监听器、设置 static final 常量
- 避免在其中调用可能被子类重写的方法——此时子类尚未加载,容易返回 null 或默认值
- 多个静态块按源码书写顺序执行,父类静态块一定先于子类
构造代码块:每次 new 都走一遍,统一对象初始化入口
写在类中、方法外,无修饰符,会在每个构造方法体执行前自动运行。它是多个构造器共用初始化逻辑的理想位置:
- 设置实例字段默认值(如 status = "INIT";)、生成唯一 ID、打日志标记
- 不能访问尚未声明的字段,遵循代码中出现的顺序
- 不替代构造方法——复杂逻辑仍应放在构造函数里;也不该调用可被子类重写的方法(子类字段此时还是默认值)
- 与实例变量直接赋值(String name = "default";)等价,二者选其一即可,避免重复或冲突
普通代码块:方法内作用域隔离,不参与初始化流程
写在方法内部的大括号 {},纯粹用于控制局部变量生命周期和避免命名冲突:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 定义临时计算变量、封装一段独立逻辑、隔离 try-catch 范围
- 变量离开 {} 即销毁,不可跨块访问;多个普通块按书写顺序依次执行,互不影响
- 若逻辑简单(如单行赋值),直接写语句更清晰;仅当需显式限制作用域时才使用
- 它不参与对象创建流程,和“初始化”无关,纯属执行流的一部分
继承场景下务必牢记完整链条
有父子类时,初始化顺序固定为:
- 父类静态变量 → 父类静态代码块
- 子类静态变量 → 子类静态代码块
- 父类实例变量 → 父类构造代码块 → 父类构造方法
- 子类实例变量 → 子类构造代码块 → 子类构造方法
这意味着:父类构造器执行时,子类所有实例字段仍是默认值(0 / null)。若父类构造器中调用了被子类重写的方法,而该方法又访问了子类字段,就会出错。
规范的核心不在多写,而在写准——把逻辑放在它该在的位置,比堆砌代码更重要。

















