首先看下這段測(cè)試代碼
public class ClassLoader {
public static void main(String[] args) {
// 3.第四步耻姥,new一個(gè)類,但在new之前要處理匿名代碼塊
new ClassLoader();
}
// 1.第二步衣撬,靜態(tài)變量和靜態(tài)代碼塊的加載順序由編寫先后決定
static int sNum = 4;
// 2.第三步萧诫,靜態(tài)塊,然后執(zhí)行靜態(tài)代碼塊逗鸣,因?yàn)橛休敵龊献。蚀蛴? static {
System.out.println("靜態(tài)方法塊執(zhí)行");
}
// 4.第五步,按照順序加載匿名代碼塊慕购,代碼塊中有打印
{
System.out.println("靜態(tài)變量 =" + sNum);
sNum += 3;
System.out.println("類方法快執(zhí)行");
System.out.println("靜態(tài)變量 =" + sNum);
}
// 5.第六步聊疲,按照順序加載變量
int mNum = 5;
// 6.第七步,按照順序打印
{
System.out.println("成員方法塊執(zhí)行");
}
// 7.第八步沪悲,最后加載構(gòu)造函數(shù)获洲,完成對(duì)象的建立
ClassLoader() {
System.out.println("成員變量 =" + mNum);
System.out.println("構(gòu)造器執(zhí)行");
}
// 8.靜態(tài)方法,調(diào)用的時(shí)候才加載
static void run()
{
System.out.println("static function");
}
// 8.內(nèi)部類殿如,調(diào)用的時(shí)候才加載
static class Interior {
static {
System.out.println("Interior");
}
}
}
看下輸出結(jié)果
輸出結(jié)果表明贡珊,程序的執(zhí)行順序?yàn)椋?br>
如果類還沒(méi)有被加載:
1最爬、先執(zhí)行父類的靜態(tài)代碼塊和靜態(tài)變量初始化,并且靜態(tài)代碼塊和靜態(tài)變量的執(zhí)行順序只跟代碼中出現(xiàn)的順序有關(guān)门岔。
2爱致、執(zhí)行子類的靜態(tài)代碼塊和靜態(tài)變量初始化。
3寒随、執(zhí)行父類的實(shí)例變量初始化
4糠悯、執(zhí)行父類的構(gòu)造函數(shù)
5、執(zhí)行子類的實(shí)例變量初始化
6妻往、執(zhí)行子類的構(gòu)造函數(shù)
如果類已經(jīng)被加載:
則靜態(tài)代碼塊和靜態(tài)變量就不用重復(fù)執(zhí)行互艾,再創(chuàng)建類對(duì)象時(shí),只執(zhí)行與實(shí)例相關(guān)的變量初始化和構(gòu)造方法讯泣。