順序如下:
1、父類靜態代碼塊
2、子類靜態代碼塊
3、父類非靜態代碼
4、父類構造函數
5、子類非靜態代碼
6、子類構造函數
舉個例子:
class X{
Y y=new Y();
public X(){
System.out.print("X");
}
}
class Y{
public Y(){
System.out.print("Y");
}
}
public class Z extends X{
Y y=new Y();
public Z(){
System.out.print("Z");
}
public static void main(String[] args) {
new Z();
}
}
在上面那個Demo中輸出的結果是:YXYZ
初始化過程:
1. 初始化父類中的靜態成員變量和靜態代碼塊 ;
2. 初始化子類中的靜態成員變量和靜態代碼塊 ;
3.初始化父類的普通成員變量和代碼塊,再執行父類的構造方法;
4.初始化子類的普通成員變量和代碼塊,再執行子類的構造方法;
下面在針對另外一種實例化的Dem
public class Test
{
public static Test t1 = new Test();
{
System.out.println("blockA");
}
static
{
System.out.println("blockB");
}
public static void main(String[] args)
{
Test t2 = new Test();
}
}
/**
*結果爲:blockA blockB blockA
*/
解析如下:
靜態塊:用static申明,JVM加載類時執行,僅執行一次
構造塊:類中直接用{ }定義,每一次創建對象時執行
執行順序優先級:靜態塊>main()>構造塊>構造方法
main方法也是靜態的方法,所以也會在構造塊之前執行。
靜態塊按照申明順序執行,先執行Test t1 = new Test();觸發了構造塊的執行,所以先輸出blockA,然後執行靜態塊,輸出blockB,最後執行main方法,再輸出一次構造塊,方法中的Test t2 = new Test();輸出blockA。