# 类加载过程
加载, 验证, 准备, 解析, 初始化下面依次说说
## 加载阶段
- 三步
- 找到class文件
- class文件转变的静态结构保存在方法区
- 生成class对象,保存在方法区
- 由ClassLoader实现类加载
- 启动类加载器 boostrapClassLoder
- %JAVAHOME%/lib
- 扩展类加载器 ExtantionClassLoder
- %JAVAHOME%/
- 系统/应用类加载器 ApplicationClassLoder
- classpath
- 继承系统类加载器的自定义加载器
- findclass()
- 双亲委派模式
- 从下往上找是否存在class对象
- 从上往下加载class对象
- 思考
- JDBC、Tomcat为什么要破坏双亲委派
- [JDBC、Tomcat为什么要破坏双亲委派模型? - 川流不息& - 博客园 (cnblogs.com)](
https://www.cnblogs.com/lyc88/articles/11431383.html)
- 自定义类加载器+加密+解密
- [自定义类加载器+加密+解密 实验 - 蓝色T-shirt - 博客园 (cnblogs.com)](
https://www.cnblogs.com/wllbelief-win/p/4508370.html)
## 验证
- 主要是对类元数据等信息结构的校验
## 准备
- 对类实例赋零值
- 注意final static是在编译器编译的时候就应经进入了常量池中 , 。
## 解析
- 解析阶段常量池中的方法的符号引用直接解析成直接引用
- 解析过程之字段解析(字段查找过程)
- 该字段的字段表的Constant_Class_info常量指向的类/接口C
- 在字段查找的时候, 先在本身的类中查找, 如果没有, 从接口中查找(从最先实现开始, 从下往上), 如果接口中没有, 或者没有实现接口, 从继承的父类中查找(从最先实现开始, 从下往上)
- <img src=https://www.isolves.com/it/cxkf/bk/2022-06-28/"https://s2.loli.net/2022/06/23/RiL126c7BzOhDgC.png" alt="image-20220623164843459" style="zoom: 200%;" />
-
- 解析过程之方法解析(方法的查找)
-
- 分派
- 静态分派
- 非虚方法
- 在解析阶段中可以事先确定唯一的调用版本有静态方法、私有方法、实例构造器、父类方法4类
- final方法
- 一个类的方法重载
- 重载是根据方法的静态参数类型区分的而不是实例参数, 所以在选中方法的版本的时候也是根据方法的静态参数, 而非实例参数.
- demo
- ```java
/**
* 重载是根据方法的静态参数类型区分的而不是实例参数, 所以在选中方法的版本的时候也是根据方法的静态参数, 而非实例参数.
*/
public class StaticDispatch {
static abstract class Human {
}
static class Man extends Human {
}
static class Woman extends Human {
}
public void sayHello(Human guy) {
System.out.println("hello,guy!");
}
public void sayHello(Man guy) {
System.out.println("hello,gentleman!");
}
public void sayHello(Woman guy) {
System.out.println("hello,lady!");
}
public static void main(String[] args) {
Human man = new Man();
Human woman = new Woman();
StaticDispatch sr = new StaticDispatch();
sr.sayHello(man);
【类加载过程】sr.sayHello(woman);
//运行结果是:
//hello,guy
//hello,guy
}
}
```
-
- 如果实参类型没有直接对应匹配的方法,则实参会向上逐步类型提升,可见变长参数(数组或者...)的重载优先级是最低的, 直到找到方法
- ```java
import java.io.Serializable;
/**
* 如果实参类型没有直接对应匹配的方法,则实参会向上逐步类型提升,可见变长参数(数组或者...)的重载优先级是最低的, 直到找到方法
*/
public class OverloadTest {
// public static void sayHello(char arg) {
//
// System.out.println("hello char"); // |
// // |
// } // |
// |
public static void sayHello(int arg) {
// |
System.out.println("hello int"); // |
// ╲↓╱
}//代码我给排序了,类型自动提升过程 char,int,long,Character,Serializable,Object,char []
public static void sayHello(long arg) {
System.out.println("hello long");
}
public static void sayHello(Character arg) {
System.out.println("hello Character");
推荐阅读
- Python接入不同类型数据库的通用接口方法
- 鱼类在死亡后,为什么大多都会肚皮朝天?
- 冬奥会|再见!明起冰墩墩停产 想买的抓紧了:各类特许商品持续销售到9月
- |麝香钓鱼有效果吗?麝香、白酒和糖类在钓鱼时的相互作用关系
- 古代铜镜做什么用,古代铜镜制作过程-
- 牛蒡茶不适合什么人喝?四类人群不宜饮用牛蒡茶
- 小孩拔牙好吗
- 智能手机|男子坐地铁被陌生小男孩拔腿毛玩 手机记录全过程引热议:你怎么看?
- 胎儿先心病
- 世界历史上的五大灾难,人类历史上的十大灾难排名-