外观
一句话答案
类加载五阶段:加载(读字节码)→验证→准备(静态变量零值)→解析(符号→直接引用)→初始化(执行 <clinit>)。
核心要点
加载: 读取字节码→生成Class对象 验证: 格式/语义/字节码/符号引用验证 准备: 静态变量分配内存并赋零值 解析: 符号引用→直接引用 初始化: 执行<clinit>()(静态块/静态变量赋值)
追问与易错
追问方向:
- 准备阶段和初始化阶段的区别?(准备赋零值,初始化赋真正的值)
- 什么时候触发类的初始化?(new/静态方法/反射/子类初始化触发父类/Main类)
- 为什么有些类不会被初始化?(引用常量/数组类型/被动引用)
易错点:
- ❌ "加载就是初始化"——加载只是读字节码,初始化才执行 <clinit>
- ❌ 混淆"准备阶段"和"初始化阶段"——static int a = 10 在准备阶段是 0,初始化才是 10
💡 记忆锚点
类加载五步口诀"加验准解初":加载读字节码、验证查安全、准备给静态变量赋零值、解析把符号引用换成真实地址、初始化才执行static块赋真值。关键区分:static int a=10在准备阶段是0,初始化阶段才变10。