一、Class的生命周期
1、加载:将.class 文件读取到内存,存放在方法区(Perm Gen), 最终产品是Class对象。
2、验证:检查是否有正确数据结构。
3、准备:JVM为Class的静态变量分配内存,并设置默认初始值。
4、解析:把Class的二进制数据中的符号引用替换为直接引用。
5、初始化:JVM为执行Class 的static 语句块。会先初始化其父类。
6、使用
7、卸载:Class对象不再被使用,从方法区移除。
二、类加载器种类
1、Bootstarp 根类加载器: 加载java.lang 包等核心类
2、Extention 扩展类加载器: 加载 jre/lib/ext 下的类
3、System 系统加载器:加载classpath 的类
4、用户自定义加载器:用户自定义
三、类初始化的时机
以下动作导致类的初始化
1、创建类的实例,可以是用 new、反射、clone、反序列化等
2、调用类的static 方法、static 变量
3、调用 Class.forName(" ClassName ") 等
4、初始化类A的子类B,导致类A先被初始化
5、JVM 表明为启动类的类。如命令 " java ClassA ", ClassA 就是启动类
以下动作不会导致类的初始化:
1、调用类的 final static 变量a,如果a在编译时候就能确定值的
2、调用ClassLoader.loadClass("className")
3、初始化类A,不会初始化其实现的接口B
3、初始化接口A,不会初始化其父接口B