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

深度掌握 Java 方法重載與重寫的核心差異

     編輯:Java 相關知識

概念辨析

重載 —— 同類內的「同名不同參」

在同一個類中,多個方法同名但參數列表不同(個數、類型、順序任一差異),即構成重載。與返回值類型、異常聲明、修飾符無關。

public class Calculator {
    public int add(int a, int b) { return a + b; }
    public double add(double a, double b) { return a + b; } // 參數類型不同
    public int add(int a, int b, int c) { return a + b + c; } // 參數個數不同
}

重寫 —— 父子類間的「同名同參同返回」

子類重新定義父類已有方法,要求:方法簽名完全一致(名稱、參數列表、返回類型兼容)。體現多態性,運行時根據對象實際類型調用。

class Animal { public void sound() { System.out.println("動物聲音"); } }
class Cat extends Animal { 
    @Override public void sound() { System.out.println("喵~"); } 
}

核心差異對比表

維度重載重寫
發生位置同一個類內部父子類之間
關係類型水平關係(兄弟方法)垂直關係(繼承鏈)
參數列表必須不同必須相同
返回類型可同可不同兼容(子類返回類型可為父類返回類型子類型)
訪問權限無限制子類權限 ≥ 父類權限
異常聲明無限制子類拋出異常 ⊆ 父類異常
調用綁定編譯期靜態綁定運行期動態綁定
static/final可修飾final 禁止重寫;static 僅能隱藏不能重寫

重寫「四大鐵律」

  1. 權限不降:protected → public ✅;public → private ❌
  2. 同步修飾:父方法 static 子類必須 static(隱藏);父非靜態子類不可加 static
  3. final 禁封:被 final 修飾的方法不可重寫
  4. 異常收斂:子類只能拋出父類異常的子集或子類型

實戰陷阱案例

陷阱 1:私有方法不可重寫

class Parent { private void secret() {} }
class Child extends Parent { 
    void secret() {} // 這是新方法,非重寫!加 @Override 會編譯報錯
}

陷阱 2:靜態方法「偽重寫」

class Parent { static void greet() { System.out.println("Parent"); } }
class Child extends Parent { 
    static void greet() { System.out.println("Child"); } // 隱藏而非重寫
}
Parent p = new Child();
p.greet(); // 輸出 "Parent" — 綁定聲明類型 Parent

陷阱 3:變量遮蔽非多態

class Parent { String name = "Parent"; }
class Child extends Parent { String name = "Child"; }
Parent obj = new Child();
System.out.println(obj.name); // 輸出 "Parent" — 訪問聲明類型變量

最佳實踐指南

  • ✅ 重載:用於語義相同、參數形式不同的便利方法(如 System.out.println() 系列)
  • ✅ 重寫:用於子類特化父類行為(模板方法模式、策略模式核心)
  • 🔧 加 @Override:編譯器自動校驗重寫規範,防止拼寫錯誤
  • 🔧 慎用同名靜態/變量:父子類避免同名靜態方法與實例變量,消除歧義
  • 🔧 文檔說明契約:重寫方法需註明行為契約變更(如拋出異常縮減)

總結

重載是編譯期多態(靜態),重寫是運行期多態(動態)。前者解決「同一操作不同參數」的代碼復用,後者實現「同一接口不同實現」的擴展性。搞清二者邊界,是寫出健壯面向對象代碼的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved