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

Java 多型核心:Overriding(覆寫)與 Overloading(多載)深度解析

     編輯:Java 相關知識

Overriding(覆寫/重寫)與 Overloading(多載/重載)是 Java 多型機制的兩大支柱,雖名稱相似但語意截然不同。本文系統整理兩者規則、差異與實務陷阱。

一、Overriding(覆寫)— 子類別重新定義父類別方法

覆寫發生於繼承體系中,子類別對父類別非私有方法提供新實作。典型場景:實作介面方法、覆寫父類別具體方法。

六大鐵律:

  1. 方法名稱相同
  2. 參數列表完全一致(型別、個數、順序)
  3. 回傳型別相同(Java 5 起支援共變回傳型別)
  4. 存取權限不得縮減:protected 可覆寫為 public,不可改為 private
  5. 不得拋出更寬泛的檢查型異常:父拋 IOException,子可拋 IOException 或其子類,不可拋 Exception
  6. 父類別方法不可為 private:否則子類別只是定義新方法,非覆寫

範例:

// 父類別
protected void do(int i, double d) throws IOException { }

// 合法覆寫
public void do(int i, double d) throws IOException { }
public void do(int i, double d) throws FileNotFoundException { } // 子類異常

// 非法覆寫
private void do(int i, double d) { } // 權限縮減
public void do(int i, double d) throws Exception { } // 異常範圍擴大

二、Overloading(多載)— 同類別中同名不同參數方法

多載發生於同一類別(或子類別繼承父類別多載方法),透過參數差異區分呼叫目標。編譯期靜態綁定。

五大特徵:

  1. 方法名稱相同
  2. 參數列表必須不同(型別、個數、順序至少一項差異)
  3. 回傳型別任意(不可單靠回傳型別區分多載)
  4. 存取權限任意
  5. 拋出異常任意

核心定義:

「Two or more methods can have the same name if they have different numbers or types of parameters and thus different signatures.」

唯一硬性要求:參數列表必須改變。

三、型別轉換與多載解析優先序

當找不到完全匹配的多載方法時,Java 會嘗試自動型別轉換(Widening Primitive Conversion)尋找最匹配的簽名:

class OverloadDemo {
    void test() { System.out.println("No parameters"); }
    void test(int a, int b) { System.out.println("a and b: " + a + " " + b); }
    void test(double a) { System.out.println("Inside test(double) a: " + a); }
}

public class Overload {
    public static void main(String[] args) {
        OverloadDemo ob = new OverloadDemo();
        int i = 88;
        ob.test();           // 呼叫 test()
        ob.test(10, 20);     // 呼叫 test(int, int)
        ob.test(i);          // int → double,呼叫 test(double)
        ob.test(123.2);      // 呼叫 test(double)
    }
}

輸出:

No parameters
a and b: 10 20
Inside test(double) a: 88
Inside test(double) a: 123.2

關鍵規則: 若定義 test(int),則 ob.test(i) 會優先匹配 test(int) 而非轉型至 test(double)。自動轉換僅在找不到精確匹配時啟動,且選擇參數型別「較大且最接近」的方法。

四、快速比較表

特性Overriding (覆寫)Overloading (多載)
發生範圍父子類別之間同一類別內(含繼承而來)
方法簽名完全相同參數列表必須不同
回傳型別相同/共變任意
存取權限不得縮減無限制
檢查型異常不得擴大無限制
綁定時機執行期(動態)編譯期(靜態)
多型類型執行期多型編譯期多型

五、實務建議

  • 覆寫時務必加上 @Override 註解,編譯器可攔截簽名錯誤
  • 多載方法應語意一致,避免同名方法行為差異大導致混淆
  • 慎用自動型別轉換配合多載,易產生非預期呼叫行為
  • 覆寫是繼承多型核心,多載則是 API 易用性設計工具
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved