本文透過一道經典的 static 與 extends 結合的題目,徹底理清 Java 類載入與物件初始化的完整順序。
package com.you.hbxs.model;
class Parent {
public Parent() { System.out.println("Parent"); }
{ System.out.println("I'm your parent!"); }
static { System.out.println("靜態Parent!"); }
}
public class Child extends Parent {
public Child() { System.out.println("Child"); }
{ System.out.println("I'm your child!"); }
static { System.out.println("靜態Child!"); }
public static void main(String[] args) {
System.out.println("--------開始-----------");
new Child();
new Child();
System.out.println("--------結束-----------");
}
}
靜態Parent!
靜態Child!
--------開始-----------
I'm your parent!
Parent
I'm your child!
Child
I'm your parent!
Parent
I'm your child!
Child
--------結束-----------
Parent 類 → 執行 static 區塊 → 輸出「靜態Parent!」Child 類 → 執行 static 區塊 → 輸出「靜態Child!」new Child() 實例化:
Parent 的實例初始化塊 {...} → 輸出「I'm your parent!」Parent() → 輸出「Parent」Child 的實例初始化塊 → 輸出「I'm your child!」Child() → 輸出「Child」new Child() 實例化:重複步驟 2,靜態區塊不再執行。new 物件時執行,**在建構子之前**,父類優於子類。new 物件時執行,父類建構子(隱式或顯式 super())優於子類建構子。this、super 或調用非靜態成員。super(...),否則編譯錯誤。