文章目录
- 一、类加载是什么
- 二、类加载过程
- 1.加载
- 2.验证
- 3.准备
- 4.解析
- 5.初始化
- 三、什么时候进行类加载
- 四、双亲委派模型
- 1.三大类加载器
- 2.加载过程
- 总
一、类加载是什么
把.class文件加载到内存中,得到类对象的过程。
二、类加载过程
1.加载
找到.class文件,读取文件内容
2.验证
验证找到的文件是否为一个.class文件,.class文件有明确的数据格式
3.准备
给类对象分配空间。
注意这个空间是未初始化的空间,内存空间中的数据是全0的。
4.解析
字符串常量池中的符号引用替换为直接引用。(针对字符串常量进行初始化)
字符串常量池中的符号引用就是字符串常量,在.class文件中就已经存在了。这些字符串常量并不知道在内存中的实际地址,只知道彼此之间的相对位置。
在进行初始化后,每个字符串常量拥有了在内存中的实际地址(直接引用),但是彼此的相对位置并没有发生改变。符号引用替换成了直接引用。
举个生活中的例子,假设班级一起组织去看电影,老师会安排学生进行排队,小宇和小顾自然的排在了一起(符号引用)。在入场前小宇和小顾一直保持在一排,到了电影院后,分座位号(直接引用)时,自然也就是紧挨着了。(相对位置不变)。
5.初始化
针对类对象进行初始化
初始化静态成员、执行静态代码块,如果有父类还需要加载父类。
三、什么时候进行类加载
类加载非必要时不加载。
只有在下列三种情况时才会加载。
1.创建了类的实例;
2.使用了类的静态方法;
3.使用子类,触发了父类的加载。
四、双亲委派模型
实际是‘单亲’。
1.三大类加载器
- BootStrap ClassLoader 加载java标准库中的类
- Extension ClassLoader 加载java非标准库中的雷(但是是Sun/Oracle扩展的库的类)
- Application ClassLoader 加载自己创建的类
2.加载过程
总
祝大家顺顺利利健健康康天天开心,下次见!!!