java代码块分为静态、构造和普通三类,核心差异在于触发主体、执行时机和执行次数:静态块类加载时执行一次,构造块每次new对象前执行,普通块按方法调用顺序在局部作用域内执行。

Java代码块不是语法糖,而是有明确语义和执行时机的结构。三类代码块的核心差异不在写法,而在“谁触发”“何时跑”“跑几次”——搞清这三点,初始化逻辑就不会乱。
静态代码块:类加载时自动触发,只跑一次
用 static {} 定义,JVM 加载类(比如首次访问该类的静态成员、new 实例、反射等)时立即执行,且整个程序生命周期仅一次。多个静态块按源码顺序依次执行。
- 适合做全局一次性初始化:数据库连接池配置、日志框架启动、常量预加载
- 不能访问实例变量或调用实例方法(没对象)
- 可直接访问静态字段、调用静态方法
- 哪怕 main 方法里一句都没用到这个类,只要它被主动引用(如
Class.forName("X")),也会触发
构造代码块:每次 new 对象前自动插入,优先于构造方法
用 {}(无 static) 直接写在类体中,属于实例级别。每次调用任意构造方法前,JVM 会把所有构造块内容“复制粘贴”到该构造方法开头(编译器行为)。
- 执行时机:new 对象 → 执行所有构造块(按定义顺序)→ 执行对应构造方法体
- 可用于抽取多个构造方法共有的初始化逻辑(比如统一设置默认状态、日志记录)
- 可访问实例变量和方法,也可访问静态成员
- 子类 new 实例时,先执行父类构造块,再执行子类构造块
普通代码块:纯局部作用域,按书写顺序执行
写在方法内部的 {},本质是限定变量作用范围的语法结构,不参与类/对象初始化流程。
- 执行时机完全由方法调用流程决定,和类加载、对象创建无关
- 块内定义的变量只在该块内可见,退出即销毁
- 多个普通块在同一方法中,谁写在前面谁先执行
- 常见用途:避免变量名冲突、临时计算分组、资源短生命周期管理(配合 try-with-resources 更佳)
执行顺序总结(单类、无继承场景)
假设一个类含全部三类代码块,并执行 new X():
- 类首次加载 → 所有静态块(按序,仅1次)
- main 方法开始执行(若含 static main)
- 执行
new X()→ 所有构造块(按序)→ 构造方法体 - 若构造方法或其它方法内含普通块 → 按方法执行流,在对应位置运行
有继承时,顺序扩展为:父类静态块 → 子类静态块 → 父类构造块 → 父类构造方法 → 子类构造块 → 子类构造方法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











