**

一、类的加载步骤

**
加载:查找并加载类的二进制文件(到内存中)
分为连接与初始化
连接:
1.验证:确保被加载类的正确性
类被加载后,就进入连接阶段。将已经读入内存的类的二进制数据合并到虚拟机的运行时环境中去
验证内容:(1)类文件的结构检查
(2)语义检查
(3)字节码验证
(4)二进制兼容性的验证
2.准备:为类的静态变量分配内存,并将其初始化为默认值
3.解析:把类中的符号引用转换为直接引用
初始化:为类的静态变量赋予正确的初始值
初始化:
(1)假如类还未被加载和连接,则先加载和连接
(2)假如存在直接的父类,并且还未初始化,则先初始化父类
(3)假如存在初始化语句,依次执行初始化语句
(只有首次使用特定接口的静态变量 是才会初始化接口)
jvm规范中允许类加载器在预料某个类将要被使用时就预先加载,如果预先加载中遇到了错误,会在首次主动使用中抛出异常(LinkageError)。如果一直没有被主动使用,就不会报错。
**

二、类的加载方式

**
1.本地系统中直接加载
2.通过网络(URLClassLoader)
3.zip,jar等压缩文件
4.从专有数据库提取
5.将java文件动态编译为.class文件
类加载的最终产物是位于堆区中的class对象
class对象封装了类在方法区内的数据结构,并提供了访问方法区内的数据结构的接口

**

三、类加载器

**
含义:虚拟机加载类的具体实现(用来加载类的)
有两种类型的类加载器
1.Java虚拟机自带的加载器
(1)根类加载器(BootStrap)C\C++编写(native)
(2)扩展类加载器(Extension) Java编写
(3)系统类加载器(system)Java编写
2.用户自定义的类加载器
java.lang.classLoader的子类
用户自己定制类的加载方式

类加载器的父委托机制(除跟加载器都有)
(根类加载器是扩展类加载器的父加载器,以此类推)
加载类时,先委托父加载器去加载,如果父加载器加载不了,则用子加载器加载(子加载器不一定继承父加载器)
加载器之间的父子关系实际上是指加载器对象之间的包装关系
举个栗子: Loader1 loader1 = new ….
Loder2 loader2 = new ..(loader1);loader1就为2的父加载器
父委托机制的有点在于能够提高软件的安全性,防止加载不可靠的代码
运行时包:同一 加载器加载属于相同包的类,组成了运行时包,避免用户自定义的类冒充核心类库的类

**

四、何时初始化

**
某个类将要被使用时就预先加载
1.被动使用(不会初始化)
2.主动使用
(1):创建类的实例
(2):访问类的静态变量(或赋值)
(3):调用静态方法
(4)反射(class.forName(“……”))
(5)初始化一个类的子类
(6)虚拟机启动是被标明为启动类(运行main方法)