类加载:将Class文件中的数据加载到内存,对数据校验,转化解析,初始化,最终形成可被虚拟机直接使用的Java类型
生命周期:加载-----验证------准备------解析----初始化------使用------卸载
类加载的过程包括了加载、验证、准备、解析、初始化五个阶段,解析阶段执行顺序不确定,可以在初始化阶段之后开始(支持动态绑定),这几个阶段按顺序开始,而不是进行或者完成,通常是交叉混合进行的,
加载:类加载器: 启动类加载器:Bootstrap ClassLoader,c++实现 加载核心库 java.*
加载存放在JDKjrelib下无法被Java程序直接引用
扩展类加载器:Extension ClassLoader:加载Java平台中拓展功能的Jar包,加载扩展库 javax.*
可以直接使用扩展类加载器
应用程序类加载器:加载类路径(ClassPath)所指定的类, 加载程序所在的目录
开发者可以直接使用该类加载器,一般情况下这个就是程序中默认的类加载器
双亲委派模型:当一个类收到类加载请求,将请求委派给父类加载器完成,每一层都是如此,最终所有加载请求传到最顶层的启动类加载器,当父类无法完成加载,交给子类加载,要加载类先检查是否已经加载,是不是自己应该加载的类。自底向上检查类是否已经加载 自顶向下尝试加载类
好处:就是Java类随着它的类加载器(说白了,就是它所在的目录)一起具备了一种带有优先级的层次关系,保证了某个类在各种类加载器中都是同一个类,只被加载一次
验证:确保Class文件中的字节流包含的信息符合当前虚拟机的要求,包括文件格式,元数据,字节码,符号引用的验证
准备:正式为类变量分配内存并设置类变量初始值的阶段
解析:虚拟机将常量池中的符号引用转化为直接引用的过程
初始化:真正开始执行类中定义的Java程序代码
分派:静态分派:依赖静态类型来定位方法执行版本的分派动作,都称为静态分派 如方法重载
动态分派:在运行期根据实际类型确定方法的指向版本 如方法重写
单分派:方法的接收者和参数统称为方法字量,根据一个字量对目标方法选择
多分派:根据多个字量对目标方法选择
Java是静多动单的语言
用不同的类加载器得到的类是不同的!!!只有名字和类加载器相同才会得到相同的类
在 Java 虚拟机判断两个类是否相同的时候,使用的是类的定义加载器。也就是说,哪个类加载器启动类的加载过程并不重要,重要的是最终定义这个类的加载器
参考:https://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html