類的載入順序

2021-08-19 23:15:39 字數 1669 閱讀 1954

public class base 

public void callname()

static class sub extends base

}public static void main(string args)

}

執行base b = new sub();時由於多型 b編譯時表現為base類特性,執行時表現為sub類特性,

base b = new sub();不管是哪種狀態都會呼叫base構造器執行callname()方法;

執行方法時,由於多台表現為子類特性,所以會先在子類是否有callname();

而此時子類尚未初始化(執行完父類構造器後才會開始執行子類),

如果有就執行,沒有再去父類尋找

如果把父類callname()改為callname2(),則會輸出base

類的載入順序。

(1) 父類靜態**塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法)

(2) 子類靜態**塊(

包括靜態初始化塊,靜態屬性,但不包括靜態方法

)(3) 父類非靜態**塊(

包括非靜態初始化塊,非靜態屬性

)(4) 父類建構函式

(5) 子類非靜態**塊

( 包括非靜態初始化塊,非靜態屬性

)(6) 子類建構函式

其中:類中靜態塊按照宣告順序執行,並且(1)和(2)不需要呼叫new類例項的時候就執行了(意思就是在類載入到方法區的時候執行的)

2.其次,需要理解子類覆蓋父類方法的問題,也就是方法重寫實現多型問題。

base b = new sub();它為多型的一種表現形式,宣告是base,實現是sub類, 理解為b 編譯時表現為base類特性,執行時表現為sub類特性。

當子類覆蓋了父類的方法後,意思是父類的方法已經被重寫,題中 父類初始化呼叫的方法為子類實現的方法,子類實現的方法中呼叫的basename為子類中的私有屬性。

由1.可知,此時只執行到步驟4.,子類非靜態**塊和初始化步驟還沒有到,子類中的basename還沒有被初始化。所以此時

basename為空。

所以為null。

public class hellob extends helloa 

static

//public static hellob hb = new hellob();

public static void main(string args)

} class helloa

static

}

輸出結果:

a的靜態**塊

b的靜態**塊

a的構造**塊

a的構造方法

b的構造**塊

b的構造方法

類的載入順序

直接上 熱乎的 package test 有父類的情況 1.載入父類 1.1 為靜態屬性分配儲存空間並賦初始值 1.2 執行靜態初始化塊和靜態初始化語句 從上至下 2.載入子類 2.1 為靜態屬性分配儲存空間 2.2 執行靜態初始化塊和靜態初始化語句 從上至下 3.載入父類構造器 3.1 為例項屬性...

類的載入順序

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

類的載入順序

初始化過程 1.初始化父類中的靜態成員變數和靜態 塊 2.初始化子類中的靜態成員變數和靜態 塊 3.初始化父類的普通成員變數和 塊,再執行父類的構造方法 4.初始化子類的普通成員變數和 塊,再執行子類的構造方法 class x class y public class zextends x publ...