方法重載 是指在同一個類中定義多個同名方法,但參數列表不同(類型、個數、順序至少一項差異)。編譯器根據調用時傳入的實參類型/個數,靜態綁定到對應的方法——這屬於靜態多態(編譯期多態)。
| 條件 | 說明 | 示例 |
|---|---|---|
| 同一類 | 不能跨類(父子類同名方法是覆寫/隱藏) | class A { void f(int); void f(double); } |
| 方法名相同 | 標識符完全一致 | max(int, int) / max(double, double) |
| 參數列表不同 | 類型/個數/順序任一不同即可;返回類型、修飾符、異常聲明不能作為區分依據 | f(int) / f(int, int) / f(String, int) |
int → long → float → double,char → int 等Integer ↔ intf(int...) 優先級最低,僅在以上都不匹配時使用String → Object、ArrayList → List
class Trap {
void test(int i) { System.out.println("int"); }
void test(Integer i) { System.out.println("Integer"); }
void test(long l) { System.out.println("long"); }
void test(Object o) { System.out.println("Object"); }
void test(int... args) { System.out.println("varargs"); }
}
public static void main(String[] args) {
Trap t = new Trap();
t.test(10); // int(精確匹配)
t.test(10L); // long(精確匹配)
t.test(new Integer(10)); // Integer(精確匹配)
t.test("hello"); // Object(向上轉型)
t.test(); // varargs(可變參數)
// t.test((short)10); // 編譯錯誤:short→int 需隱式轉型,但有 int 方法,會匹配 int
}
| 維度 | 重載 | 覆寫 |
|---|---|---|
| 發生位置 | 同一類 | 父子類 |
| 方法名 | 相同 | 相同 |
| 參數列表 | 必須不同 | 必須相同 |
| 返回類型 | 可不同 | 必須兼容(协变返回) |
| 權限修飾符 | 無要求 | 不能更嚴格 |
| 多態類型 | 靜態(編譯期) | 動態(運行期) |
| 典型用途 | 簡化 API、處理不同類型輸入 | 實現具體業務邏輯差異 |
public class HttpClientUtil {
// GET 請求多種重載
public static String get(String url) throws IOException { return get(url, null, null); }
public static String get(String url, Map<String, String> params) throws IOException { return get(url, params, null); }
public static String get(String url, Map<String, String> params, Map<String, String> headers) throws IOException { /* 核心實現 */ }
}
public class UserBuilder {
private String name, email; private int age;
public UserBuilder name(String n) { this.name = n; return this; }
public UserBuilder email(String e) { this.email = e; return this; }
public UserBuilder age(int a) { this.age = a; return this; }
public User build() { return new User(name, email, age); }
}
// 使用:new UserBuilder().name("張三").age(25).build();
public class Logger {
public void info(String msg) { log(Level.INFO, msg, null); }
public void info(String msg, Throwable t) { log(Level.INFO, msg, t); }
public void info(String format, Object... args) { log(Level.INFO, String.format(format, args), null); }
// debug/warn/error 同理重載
}
public class ConnectionConfig {
private String host; private int port; private String user; private String pwd;
public ConnectionConfig(String host) { this(host, 3306); }
public ConnectionConfig(String host, int port) { this(host, port, "root", ""); }
public ConnectionConfig(String host, int port, String user) { this(host, port, user, ""); }
public ConnectionConfig(String host, int port, String user, String pwd) { /* 全參 */ }
}
Object、可變參數、基本類型寬化同時存在的重載,易導致調用意圖不清@see 關聯重載方法,說明各參數含義差異方法重載是 Java 提供靜態多態的核心機制,通過編譯期根據參數列表綁定具體實現,極大提升了 API 的易用性與表達力。掌握匹配優先級規則、區分重載與覆寫、避免模糊重載陷阱,是寫出優雅、健壯 Java 代碼的關鍵技能。