类初始化顺序-静态代码块、代码块、构造函数、静态成员变量、成员变
参考文章: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.执行子类的构造代码块, 初始化子类普通成员变量 ,并执行子类的构造函数
即:
(父类静态代码块、静态变量)>(子类静态代码块、静态变量)>(父类构造代码块、变量)>父类构造器> (子类构造代码块、变量)>子类构造器
初始化顺序图:
初始化顺序图