在Java中,重寫和重載是方法的重要特性,初學者很容易混淆。它們都能讓方法“改頭換面”,但本質區別很大,今天我們就來詳細區分這兩個概念。
一、方法重載(Overload):“換參數”的分身術¶
想象你有一個計算器,需要處理不同類型的數字相加:兩個整數相加、兩個小數相加、甚至三個整數相加。這時候,你可以用同一個方法名,但不同的參數來實現,這就是“重載”。
定義:¶
在同一個類中,方法名相同,但參數列表不同(參數的類型、數量或順序不同),稱爲方法重載。
返回值類型、訪問修飾符、拋出異常可以不同,但僅看參數列表區分重載。
例子:¶
public class Calculator {
// 重載1:兩個int相加
public int add(int a, int b) {
return a + b;
}
// 重載2:兩個double相加(參數類型不同)
public double add(double a, double b) {
return a + b;
}
// 重載3:三個int相加(參數數量不同)
public int add(int a, int b, int c) {
return a + b + c;
}
}
調用時,Java會根據傳入的參數自動匹配方法:
Calculator calc = new Calculator();
int sum1 = calc.add(1, 2); // 匹配第一個add(int, int)
double sum2 = calc.add(1.5, 2.5); // 匹配第二個add(double, double)
int sum3 = calc.add(1, 2, 3); // 匹配第三個add(int, int, int)
注意:¶
- 僅參數列表不同才能重載,返回值不同不算重載。例如:
// 錯誤!參數相同,返回值不同,不能構成重載
public int add(int a, int b) { return a + b; }
public double add(int a, int b) { return a + b; } // 編譯報錯
- 靜態方法也可以重載,比如
public static void show()和public static void show(String msg)。
二、方法重寫(Override):“換實現”的升級改造¶
當子類繼承父類後,可能需要修改父類方法的具體實現(比如父類的“動物叫”方法,子類“狗”要改成“汪汪叫”),這就是“重寫”。
定義:¶
子類繼承父類後,重新實現父類的方法。要求:
- 方法名、參數列表完全相同(方法簽名必須一致)。
- 返回值類型:子類返回值需是父類返回值類型的子類(如父類返回Object,子類返回String)。
- 訪問權限:子類不能比父類更嚴格(比如父類是public,子類不能是private)。
- 異常拋出:子類拋出的異常範圍不能超過父類。
例子:¶
// 父類:動物類
class Animal {
public void bark() {
System.out.println("動物發出叫聲");
}
}
// 子類:狗類(繼承Animal)
class Dog extends Animal {
// 重寫父類的bark()方法
@Override
public void bark() {
System.out.println("汪汪汪!"); // 重寫後的新實現
}
}
調用時,多態會優先執行子類的重寫方法:
Animal animal = new Dog(); // 向上轉型
animal.bark(); // 輸出:汪汪汪!
注意:¶
- 參數列表必須完全相同,否則是重載而非重寫。例如:
class Dog extends Animal {
// 錯誤!參數不同,不是重寫(是新方法)
public void bark(String sound) {
System.out.println(sound);
}
}
- 靜態方法不能被重寫,只能“隱藏”。例如父類有
static void bark(),子類用static void bark()會隱藏父類方法,而非重寫。
三、重載 vs 重寫:核心區別速查表¶
| 特性 | 方法重載(Overload) | 方法重寫(Override) |
|---|---|---|
| 發生位置 | 同一類中 | 子類與父類之間 |
| 參數列表 | 必須不同(類型、數量、順序) | 必須完全相同 |
| 方法名 | 相同 | 相同 |
| 繼承關係 | 與繼承無關 | 依賴子類繼承父類 |
| 返回值 | 可不同 | 父類返回值的子類 |
| 核心目的 | 同一類中提供多參數處理方式 | 子類對父類方法的功能升級 |
總結:一句話分清¶
- 重載:同一類,“換參數”(方法名相同,參數不同)。
- 重寫:子類,“換實現”(方法名、參數相同,返回更具體)。
記住:重載看“參數”,重寫看“繼承”!多寫例子練習,就能快速掌握啦。