【重寫和重載的區別】在面向對象編程中,"重寫"(Override)和"重載"(Overload)是兩個常見的概念,它們都涉及到方法的定義,但用途和實現方式完全不同。理解這兩者的區別對于編寫清晰、高效的代碼非常重要。
一、總結
| 特性 | 重寫(Override) | 重載(Overload) |
| 定義 | 在子類中重新定義父類的方法 | 在同一個類中定義多個同名方法 |
| 方法簽名 | 必須完全一致(方法名、參數列表) | 方法名相同,參數列表不同(參數類型或數量) |
| 訪問權限 | 子類方法的訪問權限不能比父類更嚴格 | 沒有特別限制,但通常保持一致性 |
| 返回值類型 | 必須與父類方法返回值類型相同或兼容 | 必須相同 |
| 拋出異常 | 可以拋出的異常不能比父類更多或更寬泛 | 可以拋出不同的異常 |
| 調用方式 | 運行時根據對象的實際類型調用 | 編譯時根據參數類型決定調用哪個方法 |
| 應用場景 | 實現多態,覆蓋父類行為 | 提供多種調用方式,增強靈活性 |
二、詳細說明
1. 重寫(Override)
重寫是指在子類中重新定義父類已有的方法。其目的是為了改變或擴展父類的行為。重寫必須滿足以下條件:
- 方法名、參數列表必須與父類方法完全一致;
- 返回值類型必須與父類方法相同或為父類返回值類型的子類型(協變返回);
- 訪問權限不能比父類更嚴格(如父類是`protected`,子類可以是`public`,但不能是`private`);
- 不能拋出比父類方法更多的異常。
示例:
```java
class Animal {
void speak() {
System.out.println("Animal speaks");
}
}
class Dog extends Animal {
@Override
void speak() {
System.out.println("Dog barks");
}
}
```
在這個例子中,`Dog`類重寫了`Animal`類的`speak()`方法。
2. 重載(Overload)
重載是指在一個類中定義多個同名方法,但這些方法的參數列表不同(參數類型、數量或順序不同)。重載主要用于提供多種調用方式,使代碼更加靈活。
示例:
```java
class Calculator {
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
}
```
在這個例子中,`add()`方法被重載了三次,分別接受不同類型的參數或不同數量的參數。
三、總結對比
| 對比項 | 重寫 | 重載 |
| 發生位置 | 不同類之間(繼承關系) | 同一類內部 |
| 方法簽名 | 相同 | 不同 |
| 返回值 | 必須相同或兼容 | 必須相同 |
| 異常處理 | 更少或更具體 | 可不同 |
| 多態支持 | 支持 | 不支持 |
| 作用 | 實現多態,修改行為 | 增強功能,提高可讀性 |
通過以上對比可以看出,重寫和重載雖然都涉及方法的“重復”,但它們的應用場景、實現方式和目的都有顯著的不同。正確使用這兩個特性,有助于編寫結構清晰、易于維護的代碼。


