Java对象创建的过程主要分为五个步骤。
Tep:1 类加载检查
????????在实例化一个对象的时候,JVM会首先去检查目标对象是否已经被加载并初始化了。如果没有,则JVM需要加载目标类,然后调用目标类的构造器完成初始化。
?Tep:2?分配内存空间
????????当类加载检查通过后,虚拟机会为新创建的对象分配内存空间,对象所需内存空间的大小在类加载完成后就已经确定了。为对象分配内存空间其实就是在Java堆中划分出一块确定大小的内存分配给新创建的对象。分配内存的方式有“指针碰撞”(规整)和“空闲列表”(不规整)两种,选择哪种分配方式取决于Java堆内存是否规整。
??Tep:3?初始化零值
? ? ? ? 接下来,JVM会把对象里面的普通成员变量初始化为零值,比如 int 类型初始化为0,Integer 类型初始化为null。这一步操作主要是保证对象里面的实例字段不用初始化就可以直接使用。
???Tep:4?设置对象头
? ? ? ? 然后,JVM还需要对对象的对象头做一些设置,比如对象所属的类元信息、对象的GC分代年龄、hashCode、锁标记等。
????Tep:5?执行<init>方法
? ? ? ? 完成这些步骤,对于JVM来说,新对象的创建工作就完成了。但是对于Java语言来说,对象的创建才刚刚开始。
? ? ? ? init () 方法还没有执行,所有的字段都还是零值,所以,一般来说,执行完new指令后会接着执行init方法,将对象按照程序员的需求来进行初始化,这样一个真正可用的对象才算完全产生出来。
? ? ? ? init()方法是一个实例构造器,它会把语句块、变量初始化、调用父类构造器等操作组织在一起。所以调用 init方法能够完成一系列的初始化动作。