在JVM中一个类的生命周期包括了:加载、验证、准备、解析、初始化、使用、卸载7个阶段,其中验证、准备和解析统称为连接
加载
加载是第一阶段,因为此时的虚拟机中还没有class的相关信息,必须将class文件加载到虚拟机中才能进行接下来的操作。加载的过程主要分为以下3个步骤:
注意这里指定的是类的二进制流而不是说.class文件,由此可知这是个典型的面向接口编程呀,基于这个机制,我们可以把类放在任何地方。比如:在核心代码从数据库中获取、动态代理生成的类、JSP等其他文件转换
验证
验证阶段所做的操作类似于我们的一个接口接收到外部的请求之后首先需要做的事
准备
准备阶段主要是为类变量分配内存并且设置初始值。这里有两个需要注意的地方:
static int a=1static long b=2
它们的初始值其实是这样的:
a=0b=0L
而final类型的变量则没有这一步骤,设置初始值的时候跳过零值设置初始值
解析
解析阶段主要是将符合引用替换为直接引用
解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用
初始化
初始化阶段主要是为类的静态变量(准备阶段涉及的变量)赋予正确的初始值
这里需要注意的是,初始化阶段不是紧跟着解析进行的,而是当对类的主动使用才引起的类的初始化。以下几种情况会引起类的初始化:
不得不看