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