核心定義
| 概念 | 英文 | 發生範圍 | 多態類型 |
| 重載 | Overload | 同一類內 | 編譯期靜態多態 |
| 覆寫 | Override | 父子類之間 | 運行期動態多態 |
重載規則
- 方法名相同;
- 參數列表不同(類型、個數、順序任一不同);
- 返回類型可以不同;
- 修飾符可以不同;
- 僅返回類型/修飾符不同不構成重載(編譯錯誤)。
覆寫規則
- 方法名、參數列表、返回類型完全一致(Java 5+ 支援協變返回類型);
- 子類方法不能縮小父類訪問權限(
public > protected > default > private);
- 子類方法不能拋出更寬泛的受檢異常;
final/static/private/構造器不可覆寫;
@Override 註解編譯期校驗,防止拼寫錯誤。
代碼示範
Overload 示例
class OverloadDemo {
void test() { System.out.println("無參"); }
void test(int a) { System.out.println("int: " + a); }
void test(int a, int b) { System.out.println("a,b: " + a + "," + b); }
double test(double a) { System.out.println("double: " + a); return a*a; }
}
Override 示例
class A { public int getVal() { return 5; } }
class B extends A { public int getVal() { return 10; } }
public class OverrideTest {
public static void main(String[] args) {
A a = new B(); // 向上轉型
System.out.println(a.getVal()); // 10 - 動態綁定調用 B.getVal()
}
}
常見陷阱與避坑
- 私有方法不可覆寫:子類定義同名方法屬新方法,無多態;
- 靜態方法隱藏非覆寫:
A.staticMethod() 與 B.staticMethod() 靜態綁定,調用取決於引用類型;
- 構造器不可覆寫:子類構造器隱式調用
super(),非覆寫關係;
- 協變返回類型:子類覆寫返回類型可為父類返回類型的子類(如
Object clone() → MyClass clone());
- 默認方法衝突:實現多個接口含同簽名默認方法,必須顯式覆寫 並指定調用哪個(
InterfaceA.super.defaultMethod())。
設計模式中的體現
- 重載:Builder 模式鏈式調用、工廠方法多參數重載、
System.out.println 多重載;
- 覆寫:模板方法模式、策略模式具體策略、Spring 生命周期回調(
InitializingBean.afterPropertiesSet())。
一句話總結
重載是「同名不同參」的靜態分發,覆寫是「同名同參同返回」的動態分發;前者解決調用便利,後者實現運行期行為替換。