如何创建对象
在实例化一个对象的时候,JVM首先会去检查目标对象,是否已经被加载并初始化,JVM需要去做的是立刻加载目标类,然后去调用目标类的构造器,去完成初始化,目标类的加载,通过类加载器来实现的,主要就是把一个类加载到内存里面,然后是初始化的过程,主意是对目标类里面的静态变量,成员变量,静态代码块进行初始化,当目标类被初始化以后,就可以从常量池里面去找到对应的类元信息了,并且目标对象的大小,在类加载完成之后呢就已经确定了
所以这个时候,就需要为新创建的对象根据目标对象的大小,在堆内存里面去分配内存空间,内存分配空间的方式一般有两种,第一种是指针碰撞,第二种是空闲列表,JVM回去根据Java堆内存是否规整来决定内存的分配方法,JVM会去把目标对象里面的普通成员变量初始化为0值,比如说int类型初始化为0,string类型初始化为null,这一步操作主要是保证对象里面的是实例字段不用初始化就可以直接使用,也就是程序能够直接获取这些字段对应的数据类型的0值
然后JVM还需要对目标对象的对象头做一些设置,比如对象所属的类元信息,对象的GC分代年龄,hashcode,锁标记等等,完成这些步骤以后对于JVM来说,新对象的创建工作已经完成了,但是对Java语言来说,对象创建才算刚刚开始,接下来做的是执行目标对象内部生成的init方法,初始化成员变量的值,执行构造快
最后调用目标对象的构造方法去完成对象创建,其中init方法是Java文件编译之后, 是在字节码文件里面去生成的,它是一个实例构造器,这构造器里面会把构造块,变量初始化,调用父类构造器等这样一些操作组织在一起,所以调用init方法能完成一系列的初始化动作