以上運行結果 (5) (1) (10) (6) (9) (3) (2) (9) (8)(7)
(9) (3) (2) (9) (8)(7)
- 解析 考點
- 類初始化過程
- 一個類要創建實例 應先初始化該類 main方法為所在的類需要先加載和初始化
- 類初始化需要先初始化父類
- 類初始化就是執行<clinit>()方法
- <clinit>()方法由 靜態類變量顯示賦值代碼(如圖中 private static int j=method() )和靜態代碼塊組成
- 靜態類變量賦值代碼和靜態代碼塊從上到下順序執行
- <clinit>()方法只執行一次
所以如果main方法中為空的話也會默認初始化son類 即只進行類初始化
則此時結果是 (5)(1) (10)(6)
- 實例初始化過程
- 實例初始化就是執行<init>()方法
- <init>() 方法可能重載有多個 有幾個構造器就有幾個<init>方法
- <init>()方法由非靜態實例變量顯示賦值代碼和非靜態代碼塊 ,對應構造器組成
- 非靜態實例變量顯示賦值代碼和非靜態代碼塊從上到下順序執行 ,構造器的代碼最后執行
- 每次創建實例對象 調用對應構造器 執行的就是對應的<init>方法
- <init>方法的首行是super()或super(實參列表) 及對應父類的init() 方法
- 所以 子類實例初始化的時候 super()先執行 則父類調用 test()方法時 非靜態方法前面有一個默認對象this this在構造器 或<init>表示正在創建的對象 因為這里是在創建son對象 所以test()執行的是子類重寫的代碼(面向對象多態 編譯看左邊 運行看右邊)輸出(9)
子類無參構造最后執行
擴展 父類那些方法不可以被重寫
final 方法
靜態方法
private等子類中不可見的方法
對象的多態性
子類如果重寫了父類中的方法 通過子類對象調用的一定是子類重寫的方法
非靜態方法默認的調用對象是this
this對象在構造器或者說<init>方法中就是正在創建的對象