首先,需要明白類的載入順序。詳情請參考https://www.cnblogs.com/wwb0811/p/9602148.html (1) 父類靜態代碼塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法) (2) 子類靜態代碼塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法 ) (3) 父類非靜態代碼 ...
首先,需要明白類的載入順序。詳情請參考https://www.cnblogs.com/wwb0811/p/9602148.html (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。