一、概述
加载阶段:在内存中生成一个代表这个类的java.lang.Class对象
链接阶段:①验证:字节流信息符合虚拟机要求
②准备:为(类变量)static变量分配内存并设零值。
注意:这里不会为实例变量分配初始化,类变量会分配在方法区中,而实例变量是会随着对象一起分配到Java堆中
③解析:将常量池内的符号引用转换为直接引用的过程
初始化阶段:执行类构造器方法<clinit>()
的过程
-
若该类具有父类,JVM会保证子类的
<clinit>()
执行前,父类的<clinit>()
已经执行完毕 -
虚拟机必须保证一个类的
<clinit>()
方法在多线程下被同步加锁
二、类加载器
分类:
① 引导类加载器(Bootstrap ClassLoader)
Java的核心类库都是使用引导类加载器进行加载的。
② 自定义类加载器(User-Defined ClassLoader)
将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器;
系统类加载器是全局唯一的;
双亲委派机制:
-
避免类的重复加载
-
保护程序安全,防止核心API被随意篡改
判断两个class对象是否相同:
- 类的完整类名必须一致,包括包名
- 加载这个类的ClassLoader(指ClassLoader实例对象)必须相同