Java创建对象的过程?
- 判断是否被加载到内存
- Jvm遇到一条new指令时,会检查这个指令的参数是否能在常量池中定位到一个类的符号引用,检查其是否被加载,解析和初始化,如果没意义,把类加载到内存
- 为对象分配内存空间
- 分配内存有两种方式,即碰撞指针和空闲列表,如果堆内存是规整的使用碰撞指针,如果不规整使用空闲列表,堆内存的规整取决于Java垃圾回收机制是否有压缩整理的功能
- 初始化零值
- Jvm会对对象的变量初始化零值,以保证它们没有赋初值仍然可以用
- 设置对象头
- 把对象的元数据信息,哈希码,GC分代信息存到对象头上
- 执行init方法
- 此时从Jvm的角度已经完成,但从Java程序的角度,才刚开始执行init方法,把对象按照程序员的意愿初始化,完成对象的创建