Java 允許同名方法共存(多載),編譯器靠**參數型別列表**唯一區分。本文將說明核心規則:參數型別列表必須唯一、順序不同即視為不同方法、回傳型別**不參與**區分,並附簡例說明。
兩個同名方法若**參數型別列表完全相同**(型別、順序、數量),則構成重複定義,**編譯錯誤**——無論回傳型別、修飾詞、拋出異常是否不同。
參數順序差異即構成不同型別列表:
public class OverloadingOrder {
static void print(String s, int i) {
System.out.println("String: " + s + ", int: " + i);
}
static void print(int i, String s) {
System.out.println("int: " + i + ", String: " + s);
}
public static void main(String[] args) {
print("String first", 11); // 呼叫第一版
print(99, "Int first"); // 呼叫第二版
}
}
輸出:
String: String first, int: 11
int: 99, String: Int first
雖參數型別集合相同(String、int),但順序不同 → 視為兩個獨立方法。
void f() { } // 合法
int f() { } // 編譯錯誤:參數列表相同,回傳型別無法區分
這是因為呼叫端可忽略回傳值(f();),編譯器無從知曉意圖呼叫哪版。
| 差異點 | 能否區分多載 | 範例 |
|---|---|---|
| 參數數量 | ✅ | f(int) vs f(int, int) |
| 參數型別 | ✅ | f(int) vs f(String) |
| 參數順序 | ✅ | f(int, String) vs f(String, int) |
| 參數名稱 | ❌ | f(int a) vs f(int b) — 同一方法 |
| 回傳型別 | ❌ | void f() vs int f() — 錯誤 |
| 拋出異常 | ❌ | void f() throws A vs void f() throws B — 錯誤 |
| 修飾詞 | ❌ | public void f() vs private void f() — 錯誤 |
print(String)/print(int)/print(Object) 清晰明確f(int, String)/f(String, int) 易誤呼叫,文件化參數語意getCount()/getCountAsString())f(int...) 與 f(int[]) 視為相同型別列表,不可共存Java 多載區分**唯一依據**是「參數型別列表」(型別、順序、數量)。回傳型別、參數名、修飾詞、異常皆不參與。牢記此規則,即可設計清晰無歧義的多載方法族。