You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中使用类关联的数据前是否需要手动确保该类已完成加载?

Java静态初始化触发机制问题解答

核心结论

你提到的手动触发Foo类加载的操作确实是必要的。

原理说明

Java采用延迟类加载策略,不会在程序启动时就加载所有类,只有当类被「主动引用」时,才会触发类的初始化流程,静态变量赋值、静态代码块执行都发生在这个阶段。
常见的主动引用场景包括:

  • 实例化该类的对象
  • 访问该类的静态方法或非常量静态字段
  • 反射调用该类
  • 该类是包含main方法的程序启动类
  • 子类初始化时会先触发父类初始化

你的现有代码中,Basic类的main方法全程没有引用Foo类的任何内容,JVM不会主动加载Foo类,它的静态变量不会被赋值,def方法也不会执行,最终Basic.my_map不会有任何数据。

解决方案

你提到的调用空静态方法的方案完全可行:

  1. 在Foo类中定义空静态方法:public static void init() {}
  2. 在Basic的main方法开头调用Foo.init(),即可触发Foo类的初始化,所有静态变量赋值完成后,map中就会写入对应数值。

也可以用其他等价方式触发主动引用:

  • 访问Foo的任意静态字段:String tmp = Foo.a;
  • 反射加载类:Class.forName("Foo");

额外注意:你的Basic类代码存在拼写错误,定义的静态变量是my_map,main方法中调用时写的是mymap,缺少下划线,需要修正后才能正常编译运行。

疑问对应解答

  • 静态变量不会在程序启动前全部完成初始化,仅会在所属类被主动引用时才会执行初始化逻辑。
  • 如果你依赖某个类的静态初始化逻辑生成业务数据,在使用这些数据前,确实需要手动确保该类已经完成加载初始化,否则会出现数据为空的异常。

内容的提问来源于stack exchange,提问作者slit bodmod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:15:02