類載入順序

2021-08-28 12:15:22 字數 2435 閱讀 9549

目錄

一、類載入做了哪些事?

二、類載入的順序

三、乙個具體說明的例子

四、類載入前和載入後的執行順序**自

之前沒有進行類載入

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 ...