不考慮繼承結構類的類成員的初始化順序以及存在繼承的類成員初始化順序 ...
類被創建之後的成員的初始化順序到底是怎麼樣的?
首先 不考慮繼承
package com;
public class DemoOne {
/**
* 關於類的初始化順序
*/
//不考慮繼承結構的情況
private static int a=1;
private String str="我被賦值了";
static{
//為什麼static成員函數不能訪問非static變數, 不能調用非static成員函數?
//靜態代碼塊獨立於對象而存在 不依賴於對象存在 簡單來說可以直接以類型名調用DemoOne.a
//而成員變數的存在依賴於對象的創建才能被調用
//所以, static成員不能訪問非static變數, 不能調用非static成員!
// 編譯報錯 System.out.println("str ===="+ str);
System.out.println("1 靜態變數被賦初始值 a===="+a);
System.out.println("2 進入靜態塊");
}
{
System.out.println("3 成員變數被賦值 str ===="+ str);
System.out.println("4 進到普通代碼塊");
}
public void run(){
System.out.println(" 進入普通方法");
}
public static void go(){
System.out.println(" 進入靜態方法");
}
public DemoOne(){
System.out.println("5 進入構造器");
}
public static void main(String[] args) {
new DemoOne();
}
}
運行程式後輸出結果為:
1 靜態變數被賦初始值 a====1
2 進入靜態塊
3 成員變數被賦值 str ====我被賦值了
4 進到普通代碼塊
5 進入構造器
為了驗證靜態成員的順序由代碼的前後順序決定 加入第二個靜態塊
package com;
public class DemoOne {
static{
System.out.println("1 進入第一個靜態代碼塊");
}
private static int a;
static{
System.out.println("2 進入第二個靜態塊");
}
public static void main(String[] args) {
new DemoOne();
}
}
輸出結果為:
1 進入第一個靜態代碼塊
2 進入第二個靜態塊
由輸出結果可以看到 調整順序後的靜態塊先後順序發生改變
總結一下 不考慮繼承的類的成員載入順序依次為 靜態變數和常量->順序位的靜態塊->普通成員變數->普通代碼塊->構造器
下麵考慮存在父類的情況
package com; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class Demo { /** * * @param args */ private static int a=1; private String str="我在父類被賦值了"; static{ System.out.println("1 父類靜態變數被賦初始值 a===="+a); System.out.println("2 進入父類靜態塊"); } { System.out.println("5 父類成員變數被賦值 str ===="+ str); System.out.println("6 進入父類普通代碼塊"); } public Demo(){ System.out.println("7 進入父類構造器"); } }
子類
package com; public class DemoOne extends Demo{ private static int a=1; private String str="我在子類被賦值了"; static{ System.out.println("3 子類靜態變數被賦初始值 a===="+a); System.out.println("4 進入子類靜態塊"); } { System.out.println("8 子類成員變數被賦值 str ===="+ str); System.out.println("9 進入子類普通代碼塊"); } public DemoOne(){ System.out.println("10 進入子類構造器"); } public static void main(String[] args) { new DemoOne(); } }
輸出結果為:
1 父類靜態變數被賦初始值 a====1
2 進入父類靜態塊
3 子類靜態變數被賦初始值 a====1
4 進入子類靜態塊
5 父類成員變數被賦值 str ====我在父類被賦值了
6 進入父類普通代碼塊
7 進入父類構造器
8 子類成員變數被賦值 str ====我在子類被賦值了
9 進入子類普通代碼塊
10 進入子類構造器
所以存在父類的情況下 類成員的初始化順序
父類靜態變數->父類靜態塊->子類靜態變數->子類靜態塊->父類成員變數->父類普通代碼塊->父類構造器->子類成員變數->子類普通代碼塊->子類構造器
還在學習總結過程中,如若有誤,請看到的朋友及時指出。