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

Java 多態機制深度解析:條件、表現形式與存取規則

     編輯:Java 綜合教學

Java 多態機制深度解析:條件、表現形式與存取規則

多態是面向物件三大特性之一,指「一個介面,多種實現」。本文系統講解多態的滿足條件、表現形式、編譯期與執行期綁定差異、成員存取規則(變數/非靜態方法/靜態方法/子類特有成員),並附記憶體模型圖解。

一、多態滿足條件

  1. 繼承關係:子類 extends 父類,或介面實作。
  2. 方法重寫:子類重寫父類非私有、非靜態、非 final 方法。
  3. 父類引用指向子類物件:Parent p = new Child();

二、表現形式

Animal a = new Dog();   // 父類引用指向子類物件
Animal b = new Fish();  // 同一父類引用可指向不同子類物件
a.cry(); // 執行 Dog.cry()
b.cry(); // 執行 Fish.cry()

三、編譯期 vs 執行期綁定

階段綁定依據說明
編譯期引用型別(左邊)檢查引用型別是否擁有該成員,無則編譯錯誤
執行期實際物件型別(右邊)動態分派:非靜態方法呼叫子類重寫版本

口訣:編譯看左邊,執行看右邊(僅限非靜態方法)。

四、成員存取規則總結表

成員類型父子同名時存取結果原因
成員變數(非靜態/靜態)父類編譯期靜態綁定,引用型別決定
非靜態方法子類執行期動態分派,實際物件決定
靜態方法父類靜態綁定,屬於類不屬於物件
子類特有成員無法直接存取父類引用不知曉子類擴展成員

五、程式碼驗證

class Animal {
    String name = "動物";
    void cry() { System.out.println("動物叫聲"); }
    static void breathe() { System.out.println("動物呼吸"); }
}
class Dog extends Animal {
    String name = "狗";
    void cry() { System.out.println("汪汪"); }
    static void breathe() { System.out.println("狗呼吸"); }
    void fetch() { System.out.println("撿球"); }
}
public class PolyTest {
    public static void main(String[] args) {
        Animal a = new Dog();
        System.out.println(a.name);      // 動物(父類變數)
        a.cry();                         // 汪汪(子類非靜態方法)
        a.breathe();                     // 動物呼吸(父類靜態方法)
        // a.fetch();                   // 編譯錯誤:Animal 無 fetch()
        ((Dog)a).fetch();                // 強轉後可呼叫子類特有方法
    }
}

六、實戰建議

  1. 盡量面向介面/抽象類編程,降低耦合。
  2. 避免在父類定義 public 變數,改用 private + getter/setter,防止多態下變數隱藏造成困惑。
  3. 靜態方法不具備多態性,勿嘗試重寫(實為隱藏),建議用類名呼叫 Animal.breathe()。
  4. 需呼叫子類特有方法時,使用 instanceof 守衛後強轉,或引入訪問者模式/雙分派避免大量 if-else。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved