public
class
base
public
void
callname()
static
class
subextends
base
}public
static
void
main
(string[
] args)
}
1.首先,需要明白類的載入順序。
(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。
類的載入順序
直接上 熱乎的 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...