类加载过程
1.加载
加载就是将二进制文件加载到内存中
2.链接(验证,准备,解析)
验证: 验证加载的文件是否符合规范,比如:是否符合JDK规范
文件格式验证,比如常量中是否有不被支持的常量
元数据的验证,比如该类是否继承了被final修饰的类
准备:为类中所有静态变量赋他们的初始值,而不是代码中显式的赋值,
被final修饰的静态变量会直接赋予原值(常量)
解析:将符号引用转换为直接引用
符号引用:类似方法名:hello()
直接引用:内存地址,或者是偏移量
比如调用hello()方法,他的内存地址是123,那么hello就是符号引用,而123是直接引用
3.初始化
对类的静态变量,静态代码块执行初始化操作
初始化顺序
1.父类静态变量以及静态代码块
2.子类静态变量以及静态代码块
3.父类非静态变量以及非静态代码块
4.父类的构造函数
5.子类非静态变量以及非静态代码块
6.子类的构造函数
类加载器
1.启动类加载器 BootstrapClassloader 主要是加载Java核心类库
2.拓展类加载器 ExtClassLoader
3.应用程序类加载器 ApplicationClassLoader 加载java.class.path目录下的文件
5.自定义加载器