类初始化顺序-静态代码块、代码块、构造函数、静态成员变量、成员变量及继承情况下的初始化顺序

参考文章:Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序

定义:

静态代码块:用static修饰,仅在jvm加载该类时候执行一次。

构造代码块:也称普通代码块、代码块,在类中直接用{}定义的代码,当对象被创建时执行一次。


注意:

一、构造函数:

1.调用构造方法时,会创建一个对象(但不是唯一创建对象的方式,详情见tips1)

2.一般方法可以被对象多次调用,但构造方法只在对象创建时调用一次。


二、静态代码块:

1.静态代码块是由类调用的。当类被jvm加载时执行一次,且顺序优先于main函数。

2.一个类中可以有多个静态代码块。

3.静态代码块中的变量必须是static变量。


三、构造代码块:

1.对象一被建立时会运行构造代码块,顺序优先于构造函数。

2.构造代码块与构造函数的区别:构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化,因为构造函数可以有N个,不同的构造函数可以初始化出不同的对象。但无论建立哪个对象,都会先执行相同的构造代码块。也就是说,构造代码块中定义的是不同对象共性的初始化内容。

3.构造代码块和静态代码块的区别:构造代码块是给对象初始化,而静态代码块是给类初始化


执行顺序:

一、单独对于一个类而言(不涉及继承):

1.JVM加载一个类时,执行静态代码块、初始化静态变量。顺序在main函数之前。

2.创建一个对象时执行顺序:初始化变量、构造代码块>构造函数。

即:

(静态代码块、初始化静态变量)>(构造代码块、变量)>构造函数


二、当涉及继承的情况下:

1.执行父类的静态代码块,初始化父类静态成员变量

2.执行子类的静态代码块,初始化子类静态成员变量

3.执行父类的构造代码块,初始化父类普通成员变量 , 并执行父类的构造函数

4.执行子类的构造代码块, 初始化子类普通成员变量 ,并执行子类的构造函数

即:

(父类静态代码块、静态变量)>(子类静态代码块、静态变量)>(父类构造代码块、变量)>父类构造器> (子类构造代码块、变量)>子类构造器


初始化顺序图:

类初始化顺序-静态代码块、代码块、构造函数、静态成员变量、成员变量及继承情况下的初始化顺序_第1张图片
初始化顺序图

你可能感兴趣的:(类初始化顺序-静态代码块、代码块、构造函数、静态成员变量、成员变量及继承情况下的初始化顺序)