静态初始化只在类加载时执行一次,实例初始化每次创建对象时都执行;前者属类级别、后者属对象级别,执行时机、作用域和内存位置均不同。

静态初始化和实例初始化是Java中两类完全不同的初始化机制,核心区别在于“谁来触发”和“执行几次”:静态初始化属于类级别,只在类加载时执行一次;实例初始化属于对象级别,每次创建对象时都执行。
静态初始化发生在类加载阶段
静态初始化块(static {})和静态变量赋值,都在类第一次被JVM加载时触发。这个时机包括:首次new该类、首次访问其静态成员、首次反射加载、或主类启动时被主动引用。它不依赖任何对象,也不需要实例化。
- 执行顺序严格按代码从上到下,且先于所有实例相关操作
- 只运行一次,哪怕后续创建成百上千个对象
- 适合做全局性准备:比如读取配置文件、注册驱动、初始化常量池、设置线程池等
- 只能访问静态成员(静态变量、静态方法),不能用this,也不能调用实例方法或访问实例变量
实例初始化发生在对象创建时
实例初始化块({},无static修饰)在每次调用构造函数前自动执行,位置在构造函数体之前,但晚于静态初始化。
- 每new一个对象就执行一次,与对象数量完全一致
- 可以访问当前对象的所有成员:实例变量、实例方法,也能访问静态成员
- 作用是提取多个构造函数共用的初始化逻辑,避免重复代码
- 若类有继承关系,父类的实例初始化块会在子类的之前执行
它们在内存和生命周期上也不同
静态初始化关联的是类本身,数据存在方法区,随类存在而存在;实例初始化关联的是每个具体对象,数据分配在堆内存,对象销毁后即释放。
- 静态变量和静态块属于类,一份共享;实例变量和实例块属于对象,各自独立
- 静态成员可通过类名.成员名直接访问;实例成员必须通过对象.成员名访问
- 静态方法无法直接使用实例变量,但实例方法可以自由使用静态和实例成员
一个典型执行顺序示例
假设有父类Parent和子类Child,都含静态块、实例块和构造函数。完整流程是:
- 先加载Parent类 → 执行Parent静态块(仅1次)
- 再加载Child类 → 执行Child静态块(仅1次)
- new Child()时:Parent实例块 → Parent构造函数 → Child实例块 → Child构造函数
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











