方法重寫是多態性的核心體現,允許子類提供父類方法的特定實現。本文詳細講解重寫規則、協變返回類型、靜態方法隱藏等關鍵概念。
| 規則 | 說明 |
|---|---|
| 方法簽名 | 參數類型、順序、數量必須完全一致 |
| 返回類型 | JDK5+ 支持協變返回類型(子類類型) |
| 訪問權限 | 不能比父類更嚴格(public > protected > default > private) |
| 異常拋出 | 不能拋出比父類更寬泛的受檢異常 |
| final 方法 | 不可重寫 |
| static 方法 | 不屬於重寫,屬於隱藏 |
class Base {
public void test() { System.out.println("Base.test()"); }
public Base test(String name) { return this; }
public final void test(int age) { System.out.println("final Base.test(int)"); }
public static void test(Object obj) { System.out.println("static Base.test(Object)"); }
}
class Sub extends Base {
// 標準重寫
@Override public void test() { System.out.println("Sub.test()"); }
// 協變返回類型 (JDK5+)
@Override public Sub test(String name) { return this; }
// 靜態方法隱藏(非重寫)
public static void test(Object obj) { System.out.println("static Sub.test(Object)"); }
}
public static void main(String[] args) {
// 父類引用指向子類對象
Base b2 = new Sub();
b2.test(); // 輸出: Sub.test() - 動態綁定
b2.test(""); // 輸出: Sub.test() - 動態綁定
b2.test(new Object()); // 輸出: static Base.test(Object) - 靜態綁定!
// 直接調用靜態方法
Sub.test(new Object()); // 輸出: static Sub.test(Object)
Base.test(new Object()); // 輸出: static Base.test(Object)
}
