父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数


父类的类构造器<clinit>()

子类的类构造器<clinit>()

父类的成员变量和实例化代码块

父类的构造函数

子类的成员变量和实例化代码块

子类的构造函数

一:(前两项是涉及到类的初始化,只执行一次。后四项是涉及到类的实例化,创建多少个对象执行多少次)

二:(<clinit>()方法:<clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块static{}中的语句合并产生的)

<init>()方法:在编译生成的字节码中,这些构造函数会被命名成<init>()方法,参数列表与Java语言书写的构造函数的参数列表相同。 )


子类类构造器

静态域:用static申明,JVM加载类时执行,仅执行一次

  构造块:类中直接用{}定义,每一次创建对象时执行

  执行顺序优先级:静态域>main()>构造块>构造方法

ps:正确的理解是这样的:

并不是静态块最先初始化,而是静态域.(BM:啊!多么痛的领悟!)

   而静态域中包含静态变量(static int a)、静态块(static{})和静态方法(staitc void method()),其中需要初始化的是静态变量和静态块.而他们两个的初始化顺序是靠他们俩的位置决定的



深入理解Java对象的创建过程:类的初始化与实例化

类的实例化是指创建一个类的实例(对象)的过程(这个过程会先有实例变量初始化与实例代码块初始化);

类的初始化是指为类中各个类成员(被static修饰的成员变量)赋初始值的过程,是类生命周期中的一个阶段。

类的初始化是指类加载过程中的初始化阶段对类变量按照程序猿的意图进行赋值的过程;而类的实例化是指在类完全加载到内存中后创建对象的过程。

在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的。在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化。在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化。

        在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象,这种方式在Java规范中被称为 :由执行类实例创建表达式而引起的对象创建。

实例变量初始化与实例代码块初始化总是发生在构造函数初始化之前。也就是说编译器会将实例变量初始化和实例代码块初始化相关代码放到类的构造函数中去,并且这些代码会被放在对超类构造函数的调用语句之后,构造函数本身的代码之前。

代码块:  {

//我叫代码块

}

类实例化的一般过程是:父类的类构造器() -> 子类的类构造器() -> 父类的成员变量和实例代码块 -> 父类的构造函数 -> 子类的成员变量和实例代码块 -> 子类的构造函数。

类初始化阶段是执行类构造器<clinit>()方法的过程

参考链接:深入理解Java对象的创建过程:类的初始化与实例化