java类按需加载,由classloader在首次主动使用时触发,包括new实例、调用静态方法、访问非final静态字段、反射加载及初始化子类等;加载仅读入字节码并生成class对象,不执行静态代码块。

Java 类不是在程序启动时就全部加载进 JVM 的,而是按需加载——用到时才加载,这个过程由类加载器(ClassLoader)完成。
类被加载的典型时机
- 用
new创建该类的第一个实例 - 调用该类的静态方法(如
MyClass.doWork()) - 访问或修改非
final的静态字段(如MyClass.count++) - 使用
Class.forName("com.example.MyClass")反射加载(注意:ClassLoader.loadClass()不触发初始化,但会触发加载) - JVM 启动时指定的主类(含
main方法的类) - 初始化子类时(会先确保父类已加载并初始化)
⚠️ 注意:加载(Loading) ≠ 初始化(Initialization)。加载只是把
.class字节码读入方法区、生成Class对象;而初始化(执行<clinit></clinit>方法,含静态块和静态变量赋值)要等到“首次主动使用”才发生。
不会触发类加载的常见情况
- 声明变量但未使用(如
MyClass obj;) - 创建该类的数组(如
MyClass[] arr = new MyClass[10];) - 引用
public static final编译期常量(如MyClass.VERSION),因为其值直接内联到调用方的常量池中,不依赖原类加载
加载发生在哪个阶段?
类加载是整个生命周期的第一步,属于 JVM 规范定义的 五个核心阶段之一:
加载 → 验证 → 准备 → 解析 → 初始化
其中,“加载”阶段本身不执行任何 Java 代码,也不运行静态块;它只是为后续阶段准备数据结构和 Class 对象。
简单说:只要 JVM 还没见过这个类,第一次遇到上述“主动使用”场景时,就会去磁盘/网络/内存中找 .class 文件,把它读进来、解析成内部结构、并在堆里放一个 Class 实例——这就是加载完成。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











