对象的创建过程

类加载并初始化

在实例化一个对象的时候,JVM 首先会去检查目标对象是否已经被加载并初始化了。
如果没有,JVM 需要立刻去加载目标类,然后调用目标类的构造器完成初始化。 目标
类的加载是通过类加载器来实现的,主要就是把一个类加载到内存里面。然后初始化的过程,主要是对目标类里面的静态变量、成员变量、静态代码块进行初始化

分配内存空间

当目标类被初始化以后,就可以从常量池里面找到对应的类元信息,并且目标对象的大小在类加载之后就已经确定了,所以这个时候就需要为新创建的对象,根据目标对象的大小在堆内存里面分配内存空间。内存分配的方式一般有两种,一种指针碰撞,另一种是空闲列表,JVM 会根据 Java 堆内存是否规整来决定内存分配方式。

初始化对象

接下来,JVM 会把目标对象里面的普通成员变量初始化为零值,比如 int 类型初始化为0,对象类型初始化为 null,(类变量在类加载的准备阶段就已经初始化过了)。 这一步操作主要是保证对象里面的实例字段,不用初始化就可以直接使用,也就是程序 能够获得这些字段对应数据类型的零值。

设置对象头

然后,JVM 还需要对目标对象的对象头做一些设置,比如对象所属的类元信息、对象的 GC 分代年龄、hashcode、锁标记等等。

执行init方法

完成这些步骤以后,对于 JVM 来说,新对象的创建工作已经完成。但是基于 Java 语言
来说,对象创建才算是开始。 接下来要做的,就是执行目标对象内部生成的 init 方法,初始化成员变量的值、执行构造块、最后执行目标对象的构造方法,完成对象的创建。 其中,init 方法是 Java 文件编译之后在字节码文件中生成的,它是一个实例构造器,这个构造器会把语句块、变量初始化、调用父类构造器等操作组织在一起。所以调用 init方法能够完成一系列的初始化动作

 对象的创建过程_第1张图片

你可能感兴趣的:(java面试题,java)