类加载器
类的加载过程：
Java文件--->Class文件(字节码文件)--->虚拟机进行解释

加载类的时机：
1、创建类的对象
2、调用类的类方法
3、访问类或接口的类变量或为类变量赋值
4、使用反射方式来强制创建某个类或接口的Class对象
5、初始化某个类的子类
6、直接使用java.exe命令来运行某个类

其实就是只要实用了这个类或这个类的成员或者这类的子类，这时候就会加载这个类到虚拟机

类的加载过程：
1、通过一个类的全限定名(包名.类名)获取定义这个类的二进制字节流。
2、把这个字节流的静态存储结构转换为运行时数据结构
3、在内存中生成一个代表这个类的java.lang.Class对象，任何类在被使用的时候，系统都会创建他的java.lang.Class对象

类的加载过程：
    1、加载
        |-通过包名.类名，找到这个类，并且准备使用流进行传输
        |-就是把这个类加载到内存中，当加载完毕之后，就会创建一个Class对象
    2、链接
        |-1、验证
            验证阶段是链接阶段的第一步
            保证Class文件的字节流中包含的信息能够符合当前虚拟机的需求
            检查文件中的信息是不是符合虚拟机的规范，有没有安全隐患
        |-2、准备
            负责将类的类变量(static修饰的)分配内存，并且设置默认的初始化值。
        |-3、解析
            把类的二进制数据流中的符号引用替换为直接引用。
            如果当前类中引用了其他类，这个时候就需要找到对应的类。
    3、初始化
        根据我们通过程序指定的主管计划进行初始化类变量和其他的资源，
        比如进行静态变量赋值，或者进行其他的初始化资源
类的加载过程：
1、把Student.java文件编译成Student.class文件字节码文件
2、拿到了字节码文件后，开始进入到【加载】阶段，通过包名.类名获取这个类。
并且把这个类加载到内存中。加载完成后创建一个Class对象。
3、进入【链接】阶段，链接阶段主要做3件事：验证、准备、初始化。
	验证：检查一下
	准备：提前把需要加载的类的静态变量这种先加载，并初始化默认值。
	解析：把符号引用替换为直接引用。
4、进入到【初始化】阶段：完成初始化工作，比如对静态变量进行赋值

类的加载器分类：
    BootstrapClassLoader:Java虚拟机内置的类加载器，一般表示为null，并且没有父null。
    PlatformClassLoader:平台类加载器，负责加载JDK中的一些特殊的模块
    SystemClassLoader:系统类加载器，负责加载用户的类路径上指定的类库。

继承关系：
    SystemClassLoader的父加载器是PlatformClassLoader，
    PlatformClassLoader的父加载器是BootstrapClassLoader

双亲委派模型
    如果一个类加载器收到了类加载请求，它绝不会自己先去加载，而是把这个请求委托给父类的加载器去执行。
    如果父类的加载器还存在父类加载器，就会再次向上委托，依次递归，直到请求最终到达最顶层的启动类加载器。
    如果父类加载器可以完成类加载任务，就成功返回。如果父类加载器不能完成任务，子类加载器才会尝试自己加载，
    这就是双亲委派模式。

