Java 对象创建过程。init 方法和 clinit方法。

2019-10-07  本文已影响0人  w4irdo

Java 对象创建过程

判断是否加载、分配内存(指针碰撞或者空闲链表)、初始化为零值、设置对象头(实例是哪个类的实例、类的元信息位置、GC 分代年龄等)、init 方法。

对象创建的流程步骤包括:

Java 虚拟机创建一个对象包含以下步骤:

针对第三个步骤,JVM 可采用三种方式来初始化对象,采用何种方式取决于创建对象的方式:

总结对象创建过程:

  1. 首次创建对象时,类中的静态方法/静态字段首次被访问时,Java 解释器必须先查找类路径,以定位 .class 文件;
  2. 然后载入 .class(这将创建一个 Class 对象),有关静态初始化的所有动作都会执行。因此,静态初始化只在 Class 对象首次加载的时候进行一次;
  3. 当用 new 方法创建对象时,首先再堆上为对象分配足够的存储空间;
  4. 这块存储空间会被清零,这就自动地将对象中的所有基本类型数据都设置成了缺省值(对数字来说就是 0,对 boolean 和 str 也相同),而引用则被设置成了 null;
  5. 执行所有出现于字段定义处的初始化动作(非静态对象的初始化);
  6. 执行构造器。

init 方法

Java 在编译之后会在字节码文件中生成 init 方法,称之为实例构造器,该实例构造器会将语句块,变量初始化,调用父类的构造器等操作收敛到 init 方法中,收敛顺序为:

  1. 父类变量初始化
  2. 父类语句块
  3. 父类构造函数
  4. 子类变量初始化
  5. 子类语句块
  6. 子类构造函数

clinit 方法

Java 在编译之后会在字节码文件中生成 clinit 方法,称之为类构造器。类构造器同实例构造器一样,也会将静态语句块,静态变量初始化,收敛到 clinit 方法中,收敛顺序为:

  1. 父类静态变量初始化
  2. 父类静态语句块
  3. 子类静态变量初始化
  4. 子类静态语句块
  1. 父类静态变量初始化
  2. 父类静态语句块
  3. 子类静态变量初始化
  4. 子类静态语句块
  5. 父类变量初始化
  6. 父类语句块
  7. 父类构造函数
  8. 子类变量初始化
  9. 子类语句块
  10. 子类构造函数
上一篇 下一篇

猜你喜欢

热点阅读