首先,类加载就是将.class文件加载到内存,在堆中生成java.lang.Class对象的过程,并且JVM并不会一次性将所有的.class文件一次性加载到内存
然后,类加载的时机有几个场景,比如类的实例化,调用类的属性或方法,加载这个类的子类
最后,需要细致聊一下类加载的过程,其实就三步(加载、链接、初始化)
- 加载:这个过程会将.class文件的二进制字节流,通过类加载器加载到内存
- 链接:这个过程可以细分为三步
验证:这个阶段需要检验字节流是否符合JVM规范,比如检查是否继承了final修饰的类
准备:这个阶段会给类的变量开辟空间、赋默认值。比如基本类型int = 0,引用类型obj = null
解析:将常量池中的符号引用替换为直接引用。比如hello方法,替换为0x1234,也就是内存中的地址
- 初始化:这个过程就是给变量赋我们写的值,一个是生命的时候就赋值static int a = 2,一个是静态代码块中给变量赋值。
扩展
单例模式,有一种懒汉方式-实现方式,就是通过类加载时机来实现的。