首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 重載與覆寫深度對比:多態兩大支柱的規則、陷阱與實戰區分

     編輯:Java 程式設計入門

核心定義

概念英文發生範圍多態類型
重載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()
    }
}

常見陷阱與避坑

  1. 私有方法不可覆寫:子類定義同名方法屬新方法,無多態;
  2. 靜態方法隱藏非覆寫:A.staticMethod() 與 B.staticMethod() 靜態綁定,調用取決於引用類型;
  3. 構造器不可覆寫:子類構造器隱式調用 super(),非覆寫關係;
  4. 協變返回類型:子類覆寫返回類型可為父類返回類型的子類(如 Object clone() → MyClass clone());
  5. 默認方法衝突:實現多個接口含同簽名默認方法,必須顯式覆寫 並指定調用哪個(InterfaceA.super.defaultMethod())。

設計模式中的體現

  • 重載:Builder 模式鏈式調用、工廠方法多參數重載、System.out.println 多重載;
  • 覆寫:模板方法模式、策略模式具體策略、Spring 生命周期回調(InitializingBean.afterPropertiesSet())。

一句話總結

重載是「同名不同參」的靜態分發,覆寫是「同名同參同返回」的動態分發;前者解決調用便利,後者實現運行期行為替換。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved