类"初始化"阶段,它是一个类或接口被首次使用的前阶段中的最后一项工做,本阶段负责为类变量赋予正确的初始值。java
Java 编译器把全部的类变量初始化语句和类型的静态初始化器统统收集到 <clinit> 方法内,该方法只能被 Jvm 调用,专门承担初始化工做。安全
除接口之外,初始化一个类以前必须保证其直接超类已被初始化,而且该初始化过程是由 Jvm 保证线程安全的。另外,并不是全部的类都会拥有一个 <clinit>() 方法,在如下条件中该类不会拥有 <clinit>() 方法:线程
在类被装载、链接和初始化,这个类就随时均可能使用了。对象实例化和初始化是就是对象生命的起始阶段的活动,在这里咱们主要讨论对象的初始化工做的相关特色。对象
Java 编译器在编译每一个类时都会为该类至少生成一个实例初始化方法--即 "<init>()" 方法。此方法与源代码中的每一个构造方法相对应,若是类没有明确地声明任何构造方法,编译器则为该类生成一个默认的无参构造方法,这个默认的构造器仅仅调用父类的无参构造器,与此同时也会生成一个与默认构造方法对应的 "<init>()" 方法.blog
一般来讲,<init>() 方法内包括的代码内容大概为:调用另外一个 <init>() 方法;对实例变量初始化;与其对应的构造方法内的代码。接口
若是构造方法是明确地从调用同一个类中的另外一个构造方法开始,那它对应的 <init>() 方法体内包括的内容为:一个对本类的 <init>() 方法的调用;对应用构造方法内的全部字节码。get
若是构造方法不是经过调用自身类的其它构造方法开始,而且该对象不是 Object 对象,那 <init>() 法内则包括的内容为:一个对父类 <init>() 方法的调用;对实例变量初始化方法的字节码;最后是对应构造子的方法体字节码。编译器
若是这个类是 Object,那么它的 <init>() 方法则不包括对父类 <init>() 方法的调用。it
摘自https://www.ibm.com/developerworks/cn/java/j-lo-clobj-init/编译
《解析 Java 类和对象的初始化过程》