Java重寫與重載:方法的‘改頭換面’與‘改頭換面’,必分清

在Java中,重寫和重載是方法的重要特性,初學者很容易混淆。它們都能讓方法“改頭換面”,但本質區別很大,今天我們就來詳細區分這兩個概念。

一、方法重載(Overload):“換參數”的分身術

想象你有一個計算器,需要處理不同類型的數字相加:兩個整數相加、兩個小數相加、甚至三個整數相加。這時候,你可以用同一個方法名,但不同的參數來實現,這就是“重載”。

定義:

同一個類中,方法名相同,但參數列表不同(參數的類型、數量或順序不同),稱爲方法重載。
返回值類型、訪問修飾符、拋出異常可以不同,但僅看參數列表區分重載。

例子:

public class Calculator {
    // 重載1:兩個int相加
    public int add(int a, int b) {
        return a + b;
    }

    // 重載2:兩個double相加(參數類型不同)
    public double add(double a, double b) {
        return a + b;
    }

    // 重載3:三個int相加(參數數量不同)
    public int add(int a, int b, int c) {
        return a + b + c;
    }
}

調用時,Java會根據傳入的參數自動匹配方法:

Calculator calc = new Calculator();
int sum1 = calc.add(1, 2);       // 匹配第一個add(int, int)
double sum2 = calc.add(1.5, 2.5); // 匹配第二個add(double, double)
int sum3 = calc.add(1, 2, 3);     // 匹配第三個add(int, int, int)

注意:

  • 僅參數列表不同才能重載,返回值不同不算重載。例如:
  // 錯誤!參數相同,返回值不同,不能構成重載
  public int add(int a, int b) { return a + b; }
  public double add(int a, int b) { return a + b; } // 編譯報錯
  • 靜態方法也可以重載,比如public static void show()public static void show(String msg)

二、方法重寫(Override):“換實現”的升級改造

當子類繼承父類後,可能需要修改父類方法的具體實現(比如父類的“動物叫”方法,子類“狗”要改成“汪汪叫”),這就是“重寫”。

定義:

子類繼承父類後,重新實現父類的方法。要求:
- 方法名、參數列表完全相同(方法簽名必須一致)。
- 返回值類型:子類返回值需是父類返回值類型的子類(如父類返回Object,子類返回String)。
- 訪問權限:子類不能比父類更嚴格(比如父類是public,子類不能是private)。
- 異常拋出:子類拋出的異常範圍不能超過父類。

例子:

// 父類:動物類
class Animal {
    public void bark() {
        System.out.println("動物發出叫聲");
    }
}

// 子類:狗類(繼承Animal)
class Dog extends Animal {
    // 重寫父類的bark()方法
    @Override
    public void bark() {
        System.out.println("汪汪汪!"); // 重寫後的新實現
    }
}

調用時,多態會優先執行子類的重寫方法:

Animal animal = new Dog(); // 向上轉型
animal.bark(); // 輸出:汪汪汪!

注意:

  • 參數列表必須完全相同,否則是重載而非重寫。例如:
  class Dog extends Animal {
      // 錯誤!參數不同,不是重寫(是新方法)
      public void bark(String sound) { 
          System.out.println(sound);
      }
  }
  • 靜態方法不能被重寫,只能“隱藏”。例如父類有static void bark(),子類用static void bark()會隱藏父類方法,而非重寫。

三、重載 vs 重寫:核心區別速查表

特性 方法重載(Overload) 方法重寫(Override)
發生位置 同一類中 子類與父類之間
參數列表 必須不同(類型、數量、順序) 必須完全相同
方法名 相同 相同
繼承關係 與繼承無關 依賴子類繼承父類
返回值 可不同 父類返回值的子類
核心目的 同一類中提供多參數處理方式 子類對父類方法的功能升級

總結:一句話分清

  • 重載:同一類,“換參數”(方法名相同,參數不同)。
  • 重寫:子類,“換實現”(方法名、參數相同,返回更具體)。

記住:重載看“參數”,重寫看“繼承”!多寫例子練習,就能快速掌握啦。

小夜