Java 中对象的创建方式一般有两种:1)new xxx() 通过new关键字创建实例对象;2)通过反射创建对象。不管哪一种创建方式,JVM 底层的执行过程是一样的。
示例程序:
public class Person {
//静态变量
public static int staicVariabl=1;
//成员变量
public int objVariabl;
//静态初始代码块
static {
staicVariabl=2;
}
//对象初始化代码块
{
objVariabl=88;
}
//构造方法
public Person() {
objVariabl=99;
}
public static void main(String[] args) {
Person person=new Person();
}
}
1、检查类是否加载
当需要创建一个类的实例对象时,需要先判断该类是否被成功加载过,若没有加载,要先进行类的加载,如果加载过,会在堆区有一个类的 Class 对象,方法区会有类的相关元数据信息
。
(2)连接阶段:会对静态变量的值进行默认赋值
,此时 Person 类的 staicVariabl 赋值为0
(3)初始化阶段:首先会对类的静态变量 staicVariabl 进行显示赋值(此时staicVariabl =1);然后收集类的静态代码块内容,生成一个类的 <clinit>() 方法并执行(此时staicVariabl =2)
。
2、创建对象
当我们执行上面代码中 main 方法中的的 Person person=new Person() 时,我们的对象就开始创建了。
(1)main 线程申请栈空间
(2)分配内存并实例变量初始化默认值
(3)初始化对象
(4)引用对象
3、对象在内存的布局
对象创建完成后在内存中保存了保存的信息包括对象头、实例数据及对齐填充三类信息。
(1)对象头
(2)实例数据
(3)对齐填充
Person 对象最终创建完成后内存中数据情况大概如下图: