Java单例场景下静态初始化块与构造器执行顺序问题咨询
执行顺序差异原因解答
核心规则是 Java 类的初始化阶段,会按代码编写的从上到下顺序执行所有静态变量赋值操作和静态代码块,两类动作优先级完全相同,仅由编写位置决定执行顺序。你之前对「静态初始化块一定先于实例创建执行」的认知存在偏差,该结论成立的前提是:实例创建动作没有出现在静态初始化块之前的静态变量赋值逻辑中。
两个 Demo 的执行流程拆解如下:
demo1 执行流程
- 调用
demo1.Singleton.instance()时,首先触发Singleton类的初始化 Singleton类的静态内容排序为:instance()方法定义 → 静态代码块 → 构造方法定义,类初始化阶段优先执行静态代码块,输出Singleton1$static- 执行
instance()方法时访问SingletonHolder.INSTANCE,触发SingletonHolder类初始化,执行静态变量赋值逻辑new Singleton(),调用构造方法输出Singleton1$init
demo2 执行流程
- 调用
demo2.SingletonHolder.instance()时,访问Singleton.INSTANCE,触发Singleton类初始化 Singleton类的静态内容排序为:静态变量INSTANCE定义及赋值 → 静态代码块 → 构造方法定义- 按顺序先执行静态变量赋值逻辑:调用
Singleton构造方法,输出Singleton2$init - 静态变量赋值完成后,执行后续的静态代码块,输出
Singleton2$static
内容的提问来源于stack exchange,提问作者user5611
相关产品推荐
相关产品推荐

