面试题答案
一键面试类加载与类初始化的关系
类加载是类初始化的前提,类加载完成后才可能进行类初始化。只有当满足特定的类初始化条件时,才会触发在类加载基础上的类初始化操作。
执行过程差异
- 类加载过程:
- 加载:查找并加载类的二进制数据,将字节流转化为方法区的运行时数据结构,在堆中生成
java.lang.Class
对象。 - 验证:确保加载的类的字节码符合虚拟机规范,如文件格式、元数据、字节码、符号引用验证等。
- 准备:为类的静态变量分配内存并设置默认初始值(如
int
类型默认值为 0,boolean
为false
等)。 - 解析:将常量池内的符号引用替换为直接引用。例如将类名、方法名等符号引用转换为内存中的直接地址引用。
- 加载:查找并加载类的二进制数据,将字节流转化为方法区的运行时数据结构,在堆中生成
- 类初始化过程:执行类构造器
<clinit>()
方法,按照在代码中出现的顺序对静态变量进行显式初始化以及执行静态代码块。
操作内容差异
- 类加载操作内容:主要围绕获取类的二进制数据,并将其处理成虚拟机能够使用的内部数据结构,侧重于类结构的构建和基础验证。
- 类初始化操作内容:重点在于执行类中定义的静态变量赋值语句和静态代码块,完成类的静态成员的初始化,赋予其实际业务需要的值。