1.类加载定义:
    类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构

2.类加载器定义:

    实现类加载功能的代码模块

JDK内置的三大类加载器

    1.BootStrap(启动类加载器)
        I.使用c++语言实现,是JVM自身的一部分,独立于JVM外部,并且无法被java程序直接引用
        II.负责将存放于JAVA_HOME\lib目录下的能被JVM识别的所有类库(例如rt.jar - java基础类库)加载到JVM中
    
    2.ExtClassLoader(扩展类加载器)
        I.使用java语言实现,可以被java程序直接引用
        II.负责将存放于JAVA_HOME\lib\ext(xml文件解析类,界面框架类)目录下的所有能被JVM识别的类库加载到JVM中

    3.APPClassLoader(应用程序加载器)
        I.使用java语言实现,如果用户没有自定义类加载器,则AppClassLoader就是程序中默认的类加载器
        II.负责加载用户classPath指定的类库

3.类加载器的双亲委派模型

定义:四种类加载器的层次关系称为类加载器的双亲委派模型

工作流程:

如果一个类加载器收到了类加载的请求,首先自己不会尝试加载此类,而是将类加载请求委托给父类加载器完成.。每一层的类加载器都是如此。只有当父加载器无法加载此类时,子加载器才会尝试自己加载

存在意义:

双亲委派模型对于保证java程序的稳定运行十分重要.例如java.lang.Object这个类,他存放在rt.jar中,由于双亲委派模型的存在,无论哪一类类加载器要加载此类,最终都是委派给处于顶端的启动类加载器进行加载.。因此,Object类在程序的各种类加载器环境中都是同一个类。比如说我自己写了一个Object类,为了保证程序能正确执行,Object类肯定要加载rt.jar中的Object类,不能加载我自己写的Object类。

比较两个类是否相等的前提条件:这两个类是由同一个类加载器加载的
否则即使两个类来源于同一个Class文件,被同一个JVM加载,只要加载这两个类的类加载器不同,这两个类注定不相等