前言
Java对象的创建过程往往包括类初始化和类实例化两个阶段。类的初始化在前、类的实例化在后。
注意:这与spring的bean正好相反,spring的bean的生命周期,主要是先进行实例化java对象,然后在进行操作属性、最后进行初始化,这里初始化并不是java对象的初始化,而是spring的参数的初始化(initMethod、afterPropertiesSet)等。(@PostConstruct是前置拦截初始化方法)
一、类的初始化
是完成程序执行前的准备工作,初始化相关静态代码块和赋值,并分配空间,初始化只在类加载的时候执行一次。
其中类加载具体过程详见:加载 >> 验证 >> 准备 >> 解析 >> 初始化 >> 使用 >> 卸载
类的初始化顺序参考如下:
二、类的实例化
实例的构造器调用()、分配内存、属性值得定制化赋值机制
类实例化过程
检测类是否被加载没有加载的先加载→为新生对象分配内存→将分配到的内存空间都初始化为零值→对对象进行必要的设置(对象头)→执行方法把对象进行初始化:
- 检测类是否被加载
- 为新生对象分配内存
- 确定对象内存大小
- 对象头:大小确定 与类无关 与操作系统有关,包括标记字段和类型指针。
- 实例数据
即使父类的实例字段被子类覆盖或者被private修饰,都照样为其分配内存,相同宽度的字段会分配在一起,其次,父类的字段在子类之前赋值和初始化。 - 对齐填充
- 初始化零值
- 对象的访问定位
- 执行init方法
创建对象的几种方式:
- 使用new关键字
- Class对象的newInstance()方法
- 构造函数对象的newInstance()方法
- 对象反序列化
- Object对象的clone()方法
- 使用Unsafe类创建对象
参考引用:
虚拟机研究系列-你真正掌握了Java对象创建的流程吗?
java类的初始化和实例化区别
java创建对象的过程详解(从内存角度分析)