文
章
目
录
章
目
录
Java面试题:谈谈Java中类的实例化过程
得分点:
类加载、分配内存、初始化零值、状态设置、构造函数
标准回答:
在 JVM 中,对象的创建遵循如下过程:
- 类加载: 当 JVM 遇到一条字节码
new
指令时,首先检查该指令的参数是否能在常量池中找到一个类的符号引用,并验证该类是否已被加载、解析和初始化。如果尚未加载,则必须先执行相应的类加载过程。 - 分配内存: 在类加载检查通过后,虚拟机为新对象分配内存。对象所需内存的大小在类加载完成后便可确定,分配内存的任务等同于从 Java 堆中划分出一块确定大小的内存块。
- 初始化零值: 分配内存完成后,虚拟机必须将分配到的内存空间初始化为零值。如果使用了 TLAB(线程本地分配缓冲区),这一步骤可以提前至 TLAB 分配时一并进行。这确保了对象的实例字段在 Java 代码中可以不赋初值直接使用,使得程序可以访问到这些字段的数据类型所对应的零值。
- 状态设置: 接下来,虚拟机对对象进行必要的设置,包括确定对象属于哪个类、如何找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。这些信息存放在对象的对象头中,根据虚拟机当前运行状态的不同,如是否启用偏向锁等,对象头的设置方式也会不同。
- 构造函数: 虽然从虚拟机的视角看,一个新的对象已经产生,但从 Java 程序的视角看来,对象的创建才刚刚开始。构造函数,即 Class 文件中的
<init>()
方法还未执行,所有字段都保持默认的零值,对象需要的其他资源和状态信息也未按预期构造。通常情况下,new
指令后会立即执行<init>()
方法,按程序员的意愿初始化对象,这样才算完全构造出一个可用的对象。
这个过程展示了在 JVM 中创建对象的详细步骤,同时强调了构造函数在对象初始化中的重要性。这一流程保证了对象的正确创建和初始化。