Java对象的初始化

1、以下内容转自知乎某大神:

对象在class文件加载完毕,以及为各成员在方法区开辟好内存空间之后,就开始所谓的“初始化”。

步骤:

  1. 基类静态代码块、基类静态成员字段(并列优先级,按照代码中出现的先后顺序执行,并且只有在第一次加载类时执行)
  2. 派生类静态代码块、派生类静态成员字段(并列优先级,按照代码中出现的先后顺序执行,并且只有在第一次加载类时执行)
  3. 基类普通代码块、基类普通成员字段(并列优先级,按照代码中出现的先后顺序执行)
  4. 基类的构造函数
  5. 派生类普通代码块、派生类普通成员字段(并列优先级,按照代码中出现的先后顺序执行)
  6. 派生类的构造函数

注意:第1、2步的静态过程,只有在这个类第一次被加载时才运行。关于静态代码块和静态成员字段在普通代码块和普通成员字段之前,因为静态属于类,普通代码块和成员字段输入类的对象。先有的类,才有的类的实例对象。

 

2、init和clinit的区别

  1. init是对象构造器的方法,也就是程序在new一个对象调用该对象所属类的constructor方法时才执行,而clinit是类构造器方法的方法,也就是JVM进行类加载——验证——解析——初始化中的初始化阶段,JVM会调用clinit方法。
  2. init是instance实例构造器,对非静态变量初始化,而clinit是class类构造器对静态变量/静态代码块进行初始化。

参考博客

 Java中new一个对象的过程中发生了什么?

这里有一个很好的博客:大致分为类加载(加载阶段和初始化阶段)创建对象。

posted @ 2020-11-08 10:59  Peterxiazhen  阅读(221)  评论(0编辑  收藏  举报