public
class base
public
void
callname()
static class sub extends base
}public
static
void
main(string args)
}
輸出是什麼:
a. null
b. base
c. sub
1.首先,需要明白類的載入順序。
(1) 父類靜態**塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法)
(2) 子類靜態**塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法 )
(3) 父類非靜態**塊( 包括非靜態初始化塊,非靜態屬性 )
(4) 父類建構函式
(5) 子類非靜態**塊 ( 包括非靜態初始化塊,非靜態屬性 )
(6) 子類建構函式
其中:類中靜態塊按照宣告順序執行,並且(1)和(2)不需要呼叫new類例項的時候就執行了(意思就是在類載入到方法區的時候執行的)
2.其次,需要理解子類覆蓋父類方法的問題,也就是方法重寫實現多型問題。
base b = new sub();它為多型的一種表現形式,宣告是base,實現是sub類, 理解為 b 編譯時表現為base類特性,執行時表現為sub類特性。
當子類覆蓋了父類的方法後,意思是父類的方法已經被重寫,題中 父類初始化呼叫的方法為子類實現的方法,子類實現的方法中呼叫的basename為子類中的私有屬性。
base b = new
sub();
類的載入
1.1 父類的靜態**塊:無;
1.2 子類的靜態**塊:無;
類的初始化
2.1 初始化父類物件:
2.1.1 父類的非靜態**塊:private string basename = 「base」;
2.1.2 父類的建構函式:呼叫 callname 方法;由於 callname 方法被子類重寫,所以呼叫的是子類的 callname 方法;而此時子類的非靜態**塊還沒有開始執行,也就是 private string basename = 「sub」 沒有執行,所以這一步列印出來的字串是 null;
2.2 初始化子類物件:
2.2.1 子類的非靜態**塊:private string basename = 「sub」;
2.2.2 子類的建構函式:預設
java類載入順序
1 父類靜態成員和靜態初始化塊,按在 中出現的順序依次執行。2 子類靜態成員和靜態初始化塊,按在 中出現的順序依次執行。3 父類例項成員和例項初始化塊,按在 中出現的順序依次執行。4 執行父類構造方法。5 子類例項成員和例項初始化塊,按在 中出現的順序依次執行。6 執行子類構造方法。下面提供了有關靜...
java類載入順序
package com.demo description 類載入順序 author fujianyong 2015 2 6上午11 21 37 public class classloadersequence public static void test1 public void test2 pu...
Java 類載入順序
父類 靜態成員變數 父類 static 塊 子類 靜態成員變數 本類 static 塊 父類 構造塊 父類 預設構造方法 子類 構造塊 子類 有參 構造方法。package com.example.demo.basic author grace.pan date 2019 6 17 public c...