首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 多態核心:父類引用指向子類對象,new 出來的是子類實例

     編輯:程式設計綜合問答

經典面試題: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 後面的類型,再看引用類型,最後分析方法調用綁定。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved