經典面試題:X(父類) y = new Y(子類);這行代碼到底創建了什麼對象?
Y 的完整實例,包含父類 X 的所有非私有欄位與方法。X,因此只能直接訪問 X 中定義的成員(欄位、方法)。Y 重寫了父類方法,呼叫時會執行 子類版本(動態綁定/多態)。class X {
X() { System.out.println("X 無參構造"); }
}
class Y extends X {
Y() {
// 隱式調用 super() → 父類無參構造
System.out.println("Y 無參構造");
}
Y(int a) {
this(); // 呼叫本類無參構造 → 間接觸發 super()
System.out.println("Y 有參構造");
}
}
規則:子類每個構造函數的第一行必須顯式或隱式調用 super(...) 或 this(...)。若父類只有帶參構造,子類必須顯式 super(參數),否則編譯錯誤。
X y = new Y(),安全,自動發生。只能訪問 X 成員,但執行 Y 重寫邏輯。Y y2 = (Y) y,需強制轉型,運行時檢查實例真實類型,失敗拋 ClassCastException。轉型後可訪問 Y 獨有成員。「new 誰就是誰,引用決定能看見啥,運行看真身。」
理解「對象實例類型」與「引用聲明類型」的區別,是掌握 Java 多態、設計模式(如策略、模板方法)的基石。遇到此類題目,先看 new 後面的類型,再看引用類型,最後分析方法調用綁定。