java代码块是jvm隐式触发的初始化机制,分为静态、实例、局部和同步四类:静态块类加载时执行一次;实例块每次new时执行,先于构造器;局部块限作用域;同步块实现细粒度线程安全。

Java代码块不是语法糖,而是JVM隐式触发的初始化机制。它没有名字、不接受调用、不依赖方法签名,却在类加载或对象创建的关键节点自动执行——理解它,等于掌握Java对象生命周期的底层节奏。
静态代码块:类加载时只跑一次
用 static {} 定义,随类被JVM首次加载而执行,且仅一次。多个静态块按源码顺序执行。
- 适合做一次性初始化:JDBC驱动注册、配置文件读取、常量池预热
- 不能访问非静态成员(此时实例尚未存在)
- 避免耗时操作——阻塞类加载会拖慢整个应用启动
- 静态变量赋值与静态块等价,优先级相同,按书写顺序执行
实例代码块:每次new都走一遍
直接写 {}(无static),每次构造对象前自动执行,先于构造方法。
- 本质是“构造器公共前缀”,把多个重载构造器里重复的初始化逻辑提出来
- 多个实例块按定义顺序依次执行,和字段初始化并列(谁写在前面就先执行谁)
- 可访问当前对象的所有成员(包括private字段和方法)
- 注意:仅在new对象时触发;调用静态方法或访问静态字段不会激活它
局部代码块:方法内的作用域隔离
写在方法、构造器或其它代码块内部的 {},纯粹用于限制变量生命周期。
- 最常见于if/for/while等控制结构中,但也可独立存在
- 块内声明的变量只在该块内有效,退出即销毁,防止命名冲突和内存滞留
- 不参与类初始化流程,无特殊执行时机,就是普通语句执行流的一部分
- 分号可省略,不影响语法正确性
同步代码块:保护共享资源的最小单元
用 synchronized(锁对象) {} 包裹临界区,实现细粒度线程安全。
- 锁对象建议用私有final对象或this,避免用String或Integer等可能被复用的对象
- 相比同步方法,它能缩小锁定范围,减少线程阻塞时间
- 不能跨方法共享——每个同步块独立判断锁状态
- 注意死锁风险:多个同步块嵌套时,务必保证加锁顺序一致
不复杂但容易忽略:代码块没有访问修饰符,也不允许加final、public等修饰——它不是成员变量或方法,而是JVM管理的执行片段。写对位置、看清时机,比记住语法更重要。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











