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

Java 重載 vs 重寫:核心差異與面試必考點深度解析

     編輯:Java 相關知識

一、方法重載

定義

同一類中,方法名相同,參數列表不同(類型、個數、順序),返回類型可同可不同,不能以返回類型區分重載。

特點

  • 編譯期綁定(靜態綁定)。
  • 體現「編譯時多態」(靜態多態)。
  • 訪問修飾符、拋出異常無限制。

代碼示例

public class Dog {
    public void bark() { System.out.println("no barking!"); }
    public void bark(String sound) { System.out.println(sound); }
    public void bark(int times, String sound) { /* ... */ }
}

二、方法重寫

定義

子類對父類非私有方法進行重新實現,方法簽名(名、參數、返回類型)完全一致。

核心規則(口訣:一大兩小三不拋)

  1. 參數列表必須完全相同,否則是重載。
  2. 返回類型兼容:Java 5+ 支持协变返回類型(子類返回類型可為父類返回類型的子類)。
  3. 訪問權限 ≥ 父類(public > protected > default > private)。
  4. 拋出異常 ≤ 父類:不可拋出更廣泛的受檢異常,可拋出非受檢異常。

不可重寫場景

  • 父類方法標記 final。
  • 父類方法為 private(子類不可見,屬新方法)。
  • 父類方法為 static(屬隱藏而非重寫)。
  • 構造方法不可繼承,自然不可重寫。

三、動態綁定與多態實戰

class Base { void test(int i) { System.out.print(i); } }
class Sub extends Base { 
    @Override void test(int i) { System.out.println(++i); } 
}
public class Demo {
    public static void main(String[] args) {
        Base b = new Sub();
        b.test(0);      // 輸出 1(動態綁定調用 Sub.test)
        b.test((byte)0); // 輸出 0(Sub 未重寫 byte 版本,調用 Base.test)
    }
}

關鍵:引用類型決定調用哪個方法簽名(編譯期),對象實際類型決定執行哪個實現(運行期)。

四、對比總結表

維度重載重寫
發生位置同一類父子類
方法名相同相同
參數列表必須不同必須相同
返回類型可同可不同兼容(協變)
綁定時機編譯期(靜態)運行期(動態)
多態類型編譯時多態運行時多態
訪問權限無限制子類 ≥ 父類
拋出異常無限制子類 ≤ 父類

五、設計建議

  • 重載用於「同一語義、不同輸入」的便利性封裝(如 System.out.println 系列)。
  • 重寫用於「子類特化行為」,配合 @Override 註解防止低級錯誤。
  • 善用兩者可設計出結構清晰、擴展性強的類體系。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved