开局一张图 |
一般来说,类加载分为:加载、验证、准备、解析、初始化 5个步骤。
各阶段略叙 |
1、加载
将.class文件加载进内存
2、验证
判断.class文件的格式是否正确
3、准备
为类的静态变量分配内存并设置初始值。只有b、c会在此阶段进行处理。
//没有被static修饰,所以不在此阶段进行处理。在“初始化”阶段处理
public int a=123;
//这种情况下,设置的初始值为0
public static int b=123;
//如果被final修饰,则初始值为123
public static final int c=123;
4、解析
将常量池内的符号引用转换为直接引用。这个是啥意思?
假设一个场景,A类依赖B类。
在将A类的.java文件编译成.class文件时,还不知道B类的实际地址,所以只能临时用一个“符号”来代替。现在能够知道B类的实际地址了,所以要进行转换。
5、初始化
给普通变量赋初始值。注意此时的变量不包括类的静态变量。
后记 |
之前一直疑惑“创建对象和类加载是不是一回事”,通过深入了解,发现是一回事。over,下期见。