1、类加载的流程

2、各个阶段所干事的事情:
-
2.1 加载:
1、通过类的全限定名来或者类的二进制字节流
2、将字节流的静态存储结构转换为方法区的运行时数据结构
3、在内存中生成java.lang.Class对象作为访问这个类的入口
-
2.2 验证:
1、主要是验证是否符合class字节码的规范
-
2.3 准备:
1、为类变量(静态变量)分配内存,并进行初始化(每个类型的初始值即每个类型的默认值,例如:int i=10 ,但此时的值是 0)
2、对于 final int i = 10,此时 i 的值为10
-
2.4 解析:
1、将符号引用转换为直接引用的过程
-
符号引用:用一段字符串来指向一个对象的引用,
-
直接引用:直接指向内存地址的指针
-
2.5 初始化:
1、为类的静态变量初始化,执行类构造器(类静态变量和静态代码块合并产生)
- 假如这个类的直接父类还没有被初始化,则优先初始化父类
- 假如类中还有初始化语句,那么先执行初始化语句
3、用一道面试题来结束这一章节的类容
class Parent{
static {
System.out.println("父类的静态代码块");
}
{
System.out.println("父类的普通代码块");
}
public Parent(){
System.out.println("父类的构造器");
}
}
public class JvmLoadClassTest extends Parent{
static {
System.out.println("子类的静态代码块");
}
{
System.out.println("子类的代码块");
}
public JvmLoadClassTest(){
System.out.println("子类的构造器");
}
public static void main(String[] args) {
JvmLoadClassTest test = new JvmLoadClassTest();
}
}
为了大家可以更好的验证,我就直接把代码贴上来了,没有做成图片。
分析:
这里没有任何的变量,所以我们忽略前面的步骤,直接到初始化这一步来
1、如果还有父类没有初始化则初始化父类
2、如果还有初始化代码块,则执行初始化代码块
代码执行顺序的总结:父类静态代码块->子类静态代码块->父类普通代码块->父类构造器->子类普通代码块->子类构造函数
结果如下:

网友评论