類載入順序

2021-08-07 04:56:10 字數 1391 閱讀 6822

靜態變數、靜態塊、構造塊、建構函式執行順序

先看乙個demo:

parent類:

/**

* created by flh on 2017/8/20.

*/public class parent

static

public static int i = getint();

public static int getint()

static

}

child類:

public class child extends parent

public static int getint()

static

public static void main(string args)

}

輸出結果順序:

我是父類靜態**塊2

父類中靜態變數初始化

我是父類靜態**塊1

子類中靜態變數初始化

我是子類靜態**塊

我是父類構造塊2

我是父類構造塊1

我是父類建構函式

我是子類構造塊

我是子類建構函式

若已經載入過--------------------------

我是父類構造塊2

我是父類構造塊1

我是父類建構函式

我是子類構造塊

我是子類建構函式

可以得出:

如果未載入過,父類靜態**塊/靜態變數到子類靜態**塊/靜態變數 --父類構造塊 --父類建構函式 --子類構造塊--子類建構函式

注意兩點(原理分析):

(1)靜態變數和靜態**塊只會載入一次,先父類再子類,按照具體順序來。如果已載入過,則跳過這步。

原理:類的初始化是類載入過程的最後一步,也是執行類構造器()方法的過程。()方法是由編譯器自動收集類中的所有靜態變數和靜態語句塊中的語句合併產生的。()方法與類的建構函式不同,它不需要顯示呼叫父類構造器,虛擬機會保證在子類的()方法執行之前,父類的()方法執行完畢,也就意味著父類中定義的靜態塊靜態變數執行優先於子類。

(2)構造塊先於建構函式。(先父類中的構造塊和建構函式,再子類)

原理:構造**塊中定義的是不同物件共性的初始化內容,給所有物件進行統一初始化;而建構函式是給對應的物件初始化。

結論:1.父類的靜態變數、父類的靜態**塊(誰在前,誰先初始化)

2.子類的靜態變數、子類的靜態**塊(誰在前,誰先初始化)

3.父類的非靜態變數、父類的非靜態**塊(誰在前,誰先初始化)、父類的建構函式

4.子類的非靜態變數、子類的非靜態**塊(誰在前,誰先初始化)、子類的建構函式

類載入順序

1.載入靜態成員 塊 先遞迴地載入父類的靜態成員 塊 object的最先 再依次載入到本類的靜態成員。同乙個類裡的靜態成員 塊,按寫 的順序載入。如果其間呼叫靜態方法,則呼叫時會先執行靜態方法,再繼續載入。同乙個類裡呼叫靜態方法時,可以不理會寫 的順序。呼叫父類的靜態成員,可以像呼叫自己的一樣 但呼...

類載入順序

目錄 一 類載入做了哪些事?二 類載入的順序 三 乙個具體說明的例子 四 類載入前和載入後的執行順序 自 之前沒有進行類載入 1.類載入,同時初始化類中靜態的屬性 賦預設值 2.執行靜態 塊 3.分配記憶體空間,同時初始化非靜態的屬性 賦預設值 4.如果宣告屬性的同時有顯示的賦值,那麼進行顯示賦值把...

類載入器載入順序

先上 public class parent static public parent public static void staticmethod1 public static void staticmethod2 測試類 public static void main string args ...