以下這個例子非常好的闡述了父子類同時存在時靜態代碼塊/靜態變數初始化,普通代碼塊/普通成員變數初始化,構造器之間的具體運行順序。 註意,在構造器開頭,我們可以看作按順序隱藏了以下兩行關鍵執行步驟: super(); 普通代碼塊和普通屬性的初始化... 具體例子如下,運行順序在代碼註釋中以數字括弧給出 ...
以下這個例子非常好的闡述了父子類同時存在時靜態代碼塊/靜態變數初始化,普通代碼塊/普通成員變數初始化,構造器之間的具體運行順序。
註意,在構造器開頭,我們可以看作按順序隱藏了以下兩行關鍵執行步驟:
super();
普通代碼塊和普通屬性的初始化...
具體例子如下,運行順序在代碼註釋中以數字括弧給出~
public class CodeBlockDetail {
public static void main(String[] args) {
//(1) 進行類的載入
//1.1 先載入 父類 A02 1.2 再載入 B02
//(2) 創建對象
//2.1 從子類的構造器開始
new B02();//對象
}
}
class A02 { //父類
private static int n1 = getVal01();
static {
System.out.println("A02的一個靜態代碼塊..");//(2)
}
{
System.out.println("A02的第一個普通代碼塊..");//(5)
}
public int n3 = getVal02();//普通屬性的初始化
public static int getVal01() {
System.out.println("getVal01");//(1)
return 10;
}
public int getVal02() {
System.out.println("getVal02");//(6)
return 10;
}
public A02() {//構造器
//隱藏
//super()
//普通代碼和普通屬性的初始化......
System.out.println("A02的構造器");//(7)
}
}
class B02 extends A02 {
private static int n3 = getVal03();
static {
System.out.println("B02的一個靜態代碼塊..");//(4)
}
public int n5 = getVal04();
{
System.out.println("B02的第一個普通代碼塊..");//(9)
}
public static int getVal03() {
System.out.println("getVal03");//(3)
return 10;
}
public int getVal04() {
System.out.println("getVal04");//(8)
return 10;
}
public B02() {//構造器
//隱藏了
//super()
//普通代碼塊和普通屬性的初始化...
System.out.println("B02的構造器");//(10)
}
}