1.Java 在编译之后会在字节码文件中生成 <init> 方法,称之为实例构造器,该实例构造器会将语句块、变量初始化,调用父类的构造器等方法收敛到 <init> 方法中,收敛顺序为:
父类变量初始化
父类语句块
父类构造函数
子类变量初始化
子类语句块
子类构造函数
所谓收敛到 <init>方法中的意思就是将这些操作放入到 <init>中去执行
2.Java 编译之后会在字节码文件中生成 <clinit> 方法,称之为类构造器,类构造器同实例构造器一样,会将静态语句块、静态变量初始化,收敛到 <clinit> 方法中,收敛顺序为
父类静态变量初始化
父类静态语句块
子类静态变量初始化
子类静态语句块
若父类为接口,则不会调用父类的 <clinit> 方法。一个类可以没有 <clinit> 方法
<clinit> 方法是在类加载的过程中执行,而 <init> 是在类实例化的过程中执行的,所以 <clinit> 一定比 <init> 先执行