最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Java 中代码块执行顺序怎样影响对象的生命周期
时间:2026-07-02 10:46:47 编辑:袖梨 来源:一聚教程网
对象创建成功需静态代码块、构造代码块、构造方法体全部执行完毕;静态块类加载时执行一次,构造块每次new前执行,局部块仅控变量作用域。
代码块执行顺序直接决定对象“从无到有”的每一步是否完整、可靠——它不是执行细节,而是对象能否真正被创建出来的关键路径。
静态代码块:类加载时的唯一入口
当类第一次被主动使用(比如 new 对象、调用静态方法),JVM 触发类初始化,此时所有静态代码块按书写顺序执行一次。它不依赖任何对象,只和类本身绑定。如果静态块里抛出异常,整个类初始化失败,后续任何对象都无法创建。
- 只执行一次,哪怕创建一百个对象也不会再跑
- 适合初始化共享资源,如数据库连接池、配置单例
- 不能访问非静态成员,否则编译报错
构造代码块:每个对象诞生前的统一准备
每次 new 对象时,在调用构造方法体之前,构造代码块(即实例代码块)都会自动执行。它位于类中、方法外,无 static 修饰,作用是把多个构造器共用的初始化逻辑抽出来,避免重复。
- 父类构造代码块先于子类执行,顺序严格按继承链
- 字段初始化语句(如 int x = 10;)和构造代码块在底层都被编译进 <init> 方法,执行顺序由源码中出现位置决定
- 若构造代码块中抛异常,对象分配的内存不会被使用,也不会进入可达状态
局部代码块:不影响对象生命周期,但影响变量存活时间
写在方法内部的 { } 块,只控制变量作用域和栈空间释放时机,和对象创建过程完全无关。它在方法调用时执行,每次调用都重新运行,变量一出块就失效。
立即学习“Java免费学习笔记(深入)”;
- 不能加任何修饰符(public、static 等都不行)
- 嵌套块内可声明同名变量,但彼此隔离,互不影响
- 常用于循环体内,防止变量跨迭代残留或误用
执行顺序决定对象是否“真正可用”
一个对象只有在类初始化完成(静态块跑完)、实例初始化完成(构造代码块 + 构造方法体全部执行完毕)后,才被视为创建成功。中间任一环节中断(如静态块抛异常、构造块中 throw RuntimeException),对象就不会进入“可达”状态,GC 也不会介入回收——因为它根本没活过来。
- 典型顺序:静态代码块 → 构造代码块 → 构造方法体
- 父类部分总在子类之前完成
- new 表达式返回引用,不等于对象已就绪;必须等 <init> 执行完才算“活”了