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

Java 多態深度解析:定義、實現條件、優點與程式碼範例

     編輯:Java 相關知識

Java 物件導向核心:多態機制完整指南

多態是物件導向三大特性(封裝、繼承、多態)中最具威力的一項。它允許「同一訊息,不同物件,不同行為」,透過動態綁定在執行期決定實際呼叫的方法,實現程式碼的解耦與擴充。

多態的三個必要條件

  1. 繼承:子類別繼承父類別(extends)或實作介面(implements)。
  2. 覆寫:子類別重新定義父類別的方法(@Override),方法簽名相同,實作不同。
  3. 父類別參考指向子類別物件:Parent obj = new Child();(向上轉型)。

動態綁定原理

  • 編譯期:編譯器只檢查參考型別(父類別)是否有該方法,綁定方法簽名。
  • 執行期:JVM 根據實際物件型別(子類別)尋找並執行覆寫後的方法。
  • 這就是「晚期綁定」或「動態分派」。

程式碼範例:圖形繪製系統


// 父類別
abstract class Shape {
    protected String color;
    public Shape(String color) { this.color = color; }
    public abstract double area();      // 抽象方法
    public abstract void draw();        // 抽象方法
}

// 子類別:圓形
class Circle extends Shape {
    private double radius;
    public Circle(String color, double radius) {
        super(color);
        this.radius = radius;
    }
    @Override public double area() { return Math.PI * radius * radius; }
    @Override public void draw() { System.out.println("畫圓形,顏色:" + color + ",半徑:" + radius); }
}

// 子類別:矩形
class Rectangle extends Shape {
    private double width, height;
    public Rectangle(String color, double w, double h) {
        super(color);
        this.width = w; this.height = h;
    }
    @Override public double area() { return width * height; }
    @Override public void draw() { System.out.println("畫矩形,顏色:" + color + ",寬:" + width + " 高:" + height); }
}

// 客戶端程式碼
public class PolymorphismDemo {
    public static void main(String[] args) {
        Shape[] shapes = {
            new Circle("紅", 5.0),
            new Rectangle("藍", 4, 6),
            new Circle("綠", 3.0)
        };
        double totalArea = 0;
        for (Shape s : shapes) {
            s.draw();                 // 動態綁定:呼叫各自的 draw()
            totalArea += s.area();    // 動態綁定:呼叫各自的 area()
        }
        System.out.println("總面積:" + totalArea);
    }
}

輸出結果

畫圓形,顏色:紅,半徑:5.0
畫矩形,顏色:藍,寬:4.0 高:6.0
畫圓形,顏色:綠,半徑:3.0
總面積:115.5398...

多態的五大優點

優點說明
可替換性子類別物件可替換父類別參考,不影響客戶端程式碼。
可擴充性新增子類別(如 Triangle)無需修改既有使用父類別的程式碼。
介面性父類別定義共同介面(方法簽名),子類別實作細節。
靈活性執行期可動態決定具體型別(如依配置檔實例化)。
簡化性統一用父類別型別處理異構物件集合,減少型別判斷與分支。

常見誤區

  • 屬性無多態:s.color 存取的是參考型別(Shape)的屬性,非物件實際型別。若子類別定義同名屬性會造成遮蔽,不建議。
  • static 方法無多態:靜態方法屬於類別,編譯期靜態綁定,不受物件影響。
  • private 方法無法覆寫:子類別定義同名 private 方法屬於新方法,非覆寫。

實務應用:策略模式

多態是策略模式的基石。定義 interface Strategy { void execute(); },多種實作類別(ConcreteStrategyA, B...),客戶端持有 Strategy 參考,執行期注入不同策略,實現演算法熱插拔。

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