说一下类装载的执行过程?
类装载是 Java 运行时的核心机制,用盖房子的过程来类比,帮你轻松理解全过程(3 阶段 5 步骤):
一、类装载的三大阶段
就像盖房子要经过:准备材料→组装框架→装修入住
-
Loading(加载)
- 📥 找设计图:通过类加载器(ClassLoader)查找类的二进制字节流(如.class文件)
- 🏗️ 搭地基:将字节流转换为方法区的运行时数据结构,并在堆中生成 Class 对象(后续反射操作的入口)
- 🔄 类加载器协作:采用双亲委派机制,优先让父加载器尝试加载(防止重复加载和安全问题)
示例:
// 当执行 new Student() 时 ClassLoader loader = Student.class.getClassLoader(); // 实际由 AppClassLoader 加载
-
Linking(链接)
-
① Verification(验证)
🔍 质检员检查:校验字节码是否符合 JVM 规范(如魔数检查、语法验证),防止篡改的字节码执行 -
② Preparation(准备)
💰 给毛坯房通电:为静态变量(static)分配内存并设置初始值(零值)
示例:static int age = 18; 此时 age=0 -
③ Resolution(解析)
🧩 组装说明书:将符号引用(如全限定名)转换为直接引用(内存地址指针)
-
-
Initialization(初始化)
🎉 精装修入住:执行类构造器<clinit>()
方法(编译器自动收集静态代码块和静态变量赋值)
示例:上一步 age=0,此时执行 age=18
二、关键特性演示
public class LoadDemo {
static {
System.out.println("静态块:装修施工"); // 初始化阶段执行
}
private static int count = initCount(); // 初始化阶段赋值
static int initCount() {
System.out.println("静态方法:采购材料");
return 5;
}
public static void main(String[] args) {
System.out.println("count = " + count);
}
}
输出顺序:
- 静态块:装修施工
- 静态方法:采购材料
- count = 5
三、高频面试考点
-
被动引用不触发初始化
System.out.println(SubClass.superValue); // 父类的静态字段,子类不会初始化
-
接口与类的初始化差异
接口初始化不要求父接口全部初始化(用到时才初始化) -
类加载器层级
Bootstrap(加载核心库)→ Extension(扩展库)→ Application(用户类)
四、记忆口诀
“一装二链三初始”
装:找文件建结构
链:验-准-解三步行
初始:静态统统跑起来
通过这个盖房子模型,是不是对类加载过程一目了然了呢? 😊