目錄
一、類載入做了哪些事?
二、類載入的順序
三、乙個具體說明的例子
四、類載入前和載入後的執行順序**自
之前沒有進行類載入
1.類載入,同時初始化類中靜態的屬性(賦預設值)
2.執行靜態**塊
3.分配記憶體空間,同時初始化非靜態的屬性(賦預設值)
4.如果宣告屬性的同時有顯示的賦值,那麼進行顯示賦值把預設值覆蓋
5.執行匿名**塊
6.執行構造器
7.返回記憶體位址
1.static 變數
2.static **塊
3.成員變數
4.匿名塊
5.構造器
ps:先載入父類,再載入子類;
其中d繼承c,c繼承b,e,f是單獨的類,主方法在examinationdemo 中。
public class examinationdemo
}class e
// e的普通成員方法
public void funcofe()
}class f
// f的普通成員方法
public void funcoff()
}class b
//b的匿名**塊
//b的構造器
b()
//b的普通成員方法
public string getsb()
}class c extends b
// c的匿名**塊
// c的構造器
c()
}class d extends c
// d的匿名**塊
// d的構造器
d()
// d的靜態成員方法(呼叫時才載入)
static public string getsd()
// d的普通成員方法
public string getsd1()
}
從上面的**我們可以看出,載入主方法時,先執行了輸出語句,然後是new d(),由此進行載入順序的分析。
執行結果如下:
/*
* 1執行 examinationdemo 中的 main 函式, 建立 d 類例項
* 2執行 f 的建構函式
* 3執行 b 類的 static 塊(b 包含 e類的成員 變數,包含靜態 f 類成員變數)
* 4執行 f 的函式
* 5執行 c 的 static 塊(c 繼承 b)
* 6初始化 d 的 static 成員變數sd
* 7執行 d 的 static 塊(d 繼承 c)
* 8執行 e 的建構函式
* 9初始化 b 的例項成員變數 sb
* 10執行 b 例項的普通初始化塊
* 11執行 b 類的建構函式(b 包含 e 類的成員變 量,包含靜態 f 類成員變數)
* 13執行 c 的普通初始化塊
* 14執行 c 的建構函式(c 繼承b)
* 15初始化 d 的例項成員變數 sd1
* 16執行 d 例項的普通初始化塊
* 17執行 d 的建構函式(d 繼承 c);父類 b 的實 例成員變數 sb的值為:sb;本類 d 的 static 成員變數 sd 的值為:sd; 本類 d 的例項成員變數 sd1 的值是:sd1
*/
這個結果是怎麼來的,看下圖:
總體上還是按照二的載入順序來的,需要注意的是,當遇到子父類時,載入順序是:
父類的靜態成員變數,靜態**塊——>子類的靜態成員變數,靜態**塊——>父類的普通成員變數,匿名**塊,構造器
——>子類的普通成員變數,匿名**塊,構造器
靜態變數,和靜態**塊的順序先後,主要看誰先寫,先寫的先載入
new物件和成員變數的順序,誰寫在前面就先載入誰(我理解的是兩者都屬於成員變數)
成員方法不呼叫就不載入
而,當成員變數是方法時,就要呼叫該方法。
無論是靜態成員方法,還是普通成員方法,只有在呼叫時才被載入
如果類還沒有被載入:
1、先執行父類的靜態**塊和靜態變數初始化,並且靜態**塊和靜態變數的執行順序只跟**中出現的順序有關。
2、執行子類的靜態**塊和靜態變數初始化。
3、執行父類的例項變數初始化
4、執行父類的建構函式
5、執行子類的例項變數初始化
6、執行子類的建構函式
類載入順序
1.載入靜態成員 塊 先遞迴地載入父類的靜態成員 塊 object的最先 再依次載入到本類的靜態成員。同乙個類裡的靜態成員 塊,按寫 的順序載入。如果其間呼叫靜態方法,則呼叫時會先執行靜態方法,再繼續載入。同乙個類裡呼叫靜態方法時,可以不理會寫 的順序。呼叫父類的靜態成員,可以像呼叫自己的一樣 但呼...
類載入順序
靜態變數 靜態塊 構造塊 建構函式執行順序 先看乙個demo parent類 created by flh on 2017 8 20.public class parent static public static int i getint public static int getint stat...
類載入器載入順序
先上 public class parent static public parent public static void staticmethod1 public static void staticmethod2 測試類 public static void main string args ...