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