将.class文件加载到jvm中
一、 加载 :类的加载时机根据下列情况
-
主动加载
- 实例化一个对象,或者设置调用静态属性,类会被加载
- 反射调用
- 子类被加载,父类也必须被加载
- 启动main方法的类
-
被动加载
- 通过子类引用父类的静态字段,只会出发父类的初始化
- 定义对象数组和集合,不会出发该类的初始化
- 类A引用类B的static final常亮不会导致类B初始化
- 通过类名获取Class对象不会触发初始化
二、链接
1 .验证:确保呗加载的类的正确性
- 准备:为类的静态变量分配内存,并将其赋默认值,如果是final类型则赋初值
- 解析:将常量池中的符号引用替换为直接引用内存地址
-
初始化*: 为类的静态变量赋初值
- 定义静态变量时直接赋值 static String a = "123";
- 在静态代码块里为静态变量赋值
只有对类的主动使用才会导致类的初始化
-
clinit与init
编译时,会产生两个方法,一个是类的初始化方法clinit,一个是实例的初始化方法init- clinit
- 如果类中雷雨静态变量或者静态代码块,则clinit不会被生成
- 在执行clinit方法时,比如先执行父类的clinit
- clinit方法只执行一次
*static变量赋值操作和静态代码块赋值顺序是根据在源码中出现的位置决定
- init:即构造方法
- 在执行init方法时,必须先执行父类的init
- init方法每实例化一次就会执行一次
- clinit
-
卸载
- 执行System.exit()方法
- 程序正常结束
- 程序异常或者错误结束
- 虚拟机进程异常终止