JAVA初始化順序,java初始化
主要內容:
1 無繼承情況下的JAVA初始化順序
2 JAVA繼承情況下的初始化順序
無繼承情況下的JAVA初始化順序
1 class Sample 2 { 3 Sample(String s) 4 { 5 System.out.println(s); 6 } 7 Sample() 8 { 9 System.out.println("Sample預設建構函式被調用");10 }11 }12 class Test{13 static Sample sam=new Sample("靜態成員sam初始化");14 Sample sam1=new Sample("sam1成員初始化");15 static{16 System.out.println("static塊執行");17 if(sam==null)System.out.println("sam is null");18 sam=new Sample("靜態塊內初始化sam成員變數");19 }20 Test()21 {22 System.out.println("Test預設建構函式被調用");23 }24 }25 //主函數26 public static void main(String str[])27 {28 Test a=new Test();29 }View Code
輸出結果為:
靜態成員sam初始化 -----靜態成員初始化
static塊執行 -----靜態塊被執行
靜態塊內初始化sam成員變數 ----靜態塊執行
sam1成員初始化 -----普通成員初始化
Test預設建構函式被調用 -----建構函式執行
由此可以得出結論:
a 靜態成員變數首先初始化(注意,Static可以看做一個靜態成員,其執行順序和其在類中申明的順序有關)
b 普通成員初始化
c 執行建構函式。
對於靜態成員(static塊可以看成普通的一個靜態成員,其並不一定在類初始化時首先執行)和普通成員,其初始化順序只與其在類定義中的順序有關,和其他因素無關。
例如下面的例子:
1 class Test{ 2 static{ 3 System.out.println("static 塊 1 執行"); 4 } 5 static Sample staticSam1=new Sample("靜態成員staticSam1初始化"); 6 Sample sam1=new Sample("sam1成員初始化"); 7 static Sample staticSam2=new Sample("靜態成員staticSam2初始化"); 8 static{ 9 System.out.println("static 塊 2 執行");10 }11 Test()12 {13 System.out.println("Test預設建構函式被調用");14 }15 Sample sam2=new Sample("sam2成員初始化");16 }View Code
則結果為:
static 塊 1 執行
靜態成員staticSam1初始化
靜態成員staticSam2初始化
static 塊 2 執行
--------靜態成員
sam1成員初始化
sam2成員初始化
--------普通成員
Test預設建構函式被調用
--------建構函式
JAVA繼承情況下的初始化順序
1 class Sample { 2 Sample(String s) { 3 System.out.println(s); 4 } 5 6 Sample() { 7 System.out.println("Sample預設建構函式被調用"); 8 } 9 }10 11 class Test {12 static {13 System.out.println("父類static 塊 1 執行");14 }15 16 static Sample staticSam1 = new Sample("父類 靜態成員staticSam1初始化");17 Sample sam1 = new Sample("父類 sam1成員初始化");18 static Sample staticSam2 = new Sample("父類 靜態成員staticSam2初始化");19 20 static {21 System.out.println("父類 static 塊 2 執行");22 }23 24 Test() {25 System.out.println("父類 Test預設建構函式被調用");26 }27 28 Sample sam2 = new Sample("父類 sam2成員初始化");29 }30 31 class TestSub extends Test {32 static Sample staticSamSub = new Sample("子類 靜態成員staticSamSub初始化");33 34 TestSub() {35 System.out.println("子類 TestSub 預設建構函式被調用");36 }37 38 Sample sam1 = new Sample("子類 sam1成員初始化");39 static Sample staticSamSub1 = new Sample("子類 靜態成員staticSamSub1初始化");40 41 static {42 System.out.println("子類 static 塊 執行");43 }44 45 Sample sam2 = new Sample("子類 sam2成員初始化");46 }View Code
執行結果:
父類 static 塊 1 執行
父類 靜態成員staticSam1初始化
父類 靜態成員staticSam2初始化
父類 static 塊 2 執行
--------父類靜態成員初始化
子類 靜態成員staticSamSub初始化
子類 靜態成員staticSamSub1初始化
子類 static 塊 執行
-------子類靜態成員初始化
父類 sam1成員初始化
父類 sam2成員初始化
父類 Test預設建構函式被調用
-------父類普通成員初始化和建構函式執行
子類 sam1成員初始化
子類 sam2成員初始化
子類 TestSub 預設建構函式被調用
-------父類普通成員初始化和建構函式執行
由此得出JAVA初始化順序結論:
1 繼承體系的所有靜態成員初始化(先父類,後子類)
2 父類初始化完成(普通成員的初始化-->建構函式的調用)
3 子類初始化(普通成員-->建構函式)
JAVA初始化順序