类加载器:负责将.class文件(存储在物理文件)加载到内存中
类加载时机:
1、创建类的实例(对象)
2、调用类的方法
3、访问类或者接口的类变量,或者为该类变量赋值
4、使用反射方式来强制创建某个类或者接口对于的java.lang.Class对象
5、初始化某个类的子类
6、直接用java.exe命令来运行某个主类
ps:用到就加载,不用不加载
类加载过程:
加载 -> 验证 -> 准备 -> 解析 -> 初始化
验证 -> 准备 -> 解析称为链接阶段
加载:1、 通过一个类的全限定名来获取定义此类的二进制字节流—-通过报名+类名,获取这个类(字节码文件),准备用流进行传输(创建一个流)
2、将这个字节流所代表的静态储存结果转化为运行时数据结构—-(用已创建的流)将这个类(字节码文件)加载到内存中
3、在内存中生成一个代表这个类的java.lang.Class对象,任何类被使用时,系统都会为之建立一个java.lang.Class对象。—-加载完毕后在内存中创建一个class对象用来存储类中的成员信息
验证:链接阶段第一步,这一阶段为了确保Class文件字节流中包含的信息符合当前虚拟机要求,并且不会危害虚拟机自身安全。—-文件中的信息是否符合虚拟机规范,有没有隐患
准备:负责为类的类变量(被static修饰的变量)分配内存,并设置默认初始化值—-初始化静态变量(在内存class对象中为成员变量开辟空间)
ps:为school开辟空间,值设置为null
解析:将类的二进制数据流中的符号引用替换为直接引用—-本类中如果用到了其他类,此时就需要找到对应类。
ps:在最初加载类时,使用了其他类,系统不知道引用类如(String)在哪里,加载时,是使用符号替代。到解析时会去寻找String这个类在哪里,此时将符号修改为String的引用
初始化:根据程序员通过程序制定的主观计划去初始化类变量和其他资源—-静态变量赋值以及初始化其他资源(为school赋值)