java类加载过程分为加载、链接、初始化三阶段:加载将字节码载入内存并创建class对象;链接含验证、准备、解析,确保安全性与引用正确;初始化执行方法赋予静态变量实际值。

Java 类加载过程的核心是把 .class 字节码变成 JVM 能执行的类对象,整个过程按逻辑划分为加载、链接、初始化三个主阶段。它们不是完全割裂的时间点,而是有明确职责、前后依赖、部分交叉的执行流。
加载(Loading):把字节码“请进内存”
这是起点,不涉及校验或赋值,只做三件事:
- 根据类的全限定名(如
java.util.ArrayList),从文件系统、JAR 包、网络甚至运行时生成的字节码中定位并读取.class二进制数据; - 在 JVM 的方法区(JDK 8+ 是元空间)中生成类的结构信息(比如字段表、方法表、常量池等);
- 在堆中创建一个
java.lang.Class实例,作为这个类在 Java 层的唯一“代言人”,后续反射、类型判断都靠它。
此时类还没被验证,静态变量也还是未初始化状态(比如 static int x; 的值是 0,不是代码里写的初始值)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
链接(Linking):让类“合规可用”,分三步走
链接不是原子操作,它包含验证、准备、解析三个子阶段,目标是确保类安全、结构正确、引用可定位:
- 验证(Verification):检查字节码是否符合 JVM 规范,防止恶意或错误的 class 文件危害虚拟机(比如栈溢出、非法跳转、类型不匹配)。这一步是 JVM 安全的重要屏障;
-
准备(Preparation):为类的静态变量分配内存,并设为默认值(
int → 0,boolean → false,引用类型 →null)。注意:此时不会执行= 10这样的赋值语句; -
解析(Resolution):把常量池里的符号引用(比如类名、方法名、字段名这些字符串描述)替换成直接引用(比如内存地址、偏移量)。例如,把
"java/lang/Object.toString:()Ljava/lang/String;"解析成真实的方法入口地址。
初始化(Initialization):真正执行“类的逻辑”
这是类加载过程中唯一允许执行 Java 代码的阶段,核心任务是执行类构造器 <clinit></clinit> 方法——它由编译器自动收集所有静态变量赋值语句和静态代码块(static{})合并生成。
- 只有当类首次被主动使用时才触发,比如:
new实例、访问静态字段(非 final 常量)、调用静态方法、反射Class.forName()、子类初始化时父类先初始化、JVM 启动指定主类; - 初始化前会确保父类已初始化(接口除外);
- 静态变量在这一步才获得代码中定义的初始值(比如
static int x = 10;中的10就在此时写入)。
一旦完成初始化,这个类就可以被正常使用了——创建对象、调用方法、访问字段,都建立在这个坚实基础上。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










