重載與重寫的區別

一、重載與重寫的概念

在Java中,重載(overload)和重寫(override)是兩個常用的概念。重載指的是一個類中有多個方法名稱相同但參數類型或個數不同的方法;而重寫指的是繼承關係中,子類中定義了與父類中名稱、參數類型和個數都相同的方法,來覆蓋父類中的方法。

二、方法簽名

在Java中,方法的簽名是由方法名稱和參數類型組成的。重載是指在同一個類中定義方法名稱相同但參數類型或個數不同的方法。在編譯時,編譯器會根據方法的參數類型或個數判斷調用哪個方法。例如:

public class Calculation {
   public int add(int a, int b) {
      return a + b;
   }
    
   public int add(int a, int b, int c) {
      return a + b + c;
   }
}

上面的代碼定義了一個名為Calculation的類,其中定義了兩個add方法,它們的方法名相同但參數個數不同。在使用時,可以通過傳遞不同個數的參數來調用不同的方法。

Calculation calc = new Calculation();
int result1 = calc.add(1, 2);          // 調用add(int a, int b)方法
int result2 = calc.add(1, 2, 3);       // 調用add(int a, int b, int c)方法

三、繼承關係

重寫(override)指的是在類的繼承關係中,子類中定義了與父類中名稱、參數類型和個數都相同的方法,來覆蓋父類中的方法。在調用子類的方法時,如果該方法在子類中已被重寫,則會優先調用子類中的方法。

以下是一個簡單的例子:

public class Animal {
   public void move() {
      System.out.println("動物可以移動");
   }
}
public class Dog extends Animal {
   public void move() {
      System.out.println("狗可以跑和走");
   }
   public void bark() {
      System.out.println("狗可以叫");
   }
}
public class TestDog {
   public static void main(String args[]) {
      Animal animal = new Animal();   // Animal對象
      Animal dog = new Dog();         // Dog對象
      
      animal.move();                  // 執行 Animal 類的方法
      dog.move();                     // 執行 Dog 類的方法
  }
}

輸出結果如下:

動物可以移動
狗可以跑和走

四、重載和重寫的區別

重載是在同一個類中定義方法名稱相同但參數類型或個數不同的方法,重寫是在繼承關係中,子類中定義了與父類中名稱、參數類型和個數都相同的方法,來覆蓋父類中的方法。兩者的區別在於:

  • 重載的目的是為了方便調用同一種功能的不同實現,重寫的目的是為了實現子類對父類的方法進行覆蓋和擴展;
  • 重載的方法的參數類型和個數不同,重寫的方法的參數類型和個數必須相同;
  • 重載是在同一個類中進行的,重寫是在繼承關係中進行的。

下面是一個同時使用重載和重寫的例子:

public class Calculation {
   public int add(int a, int b) {
      return a + b;
   }
    
   public double add(double a, double b) {
      return a + b;
   }
}
public class MoreCalculation extends Calculation {
   @Override
   public int add(int a, int b) {
      return a + b + 1;
   }
}
public class TestCalculation {
   public static void main(String args[]) {
      Calculation calc = new MoreCalculation();
        
      System.out.println(calc.add(1, 2));         // 輸出4,調用MoreCalculation類的add(int a, int b)方法
      System.out.println(calc.add(1.0, 2.0));     // 輸出3.0,調用Calculation類的add(double a, double b)方法
   }
}

上面的代碼中,定義了三個類:Calculation、MoreCalculation和TestCalculation。Calculation類中定義了兩個add方法,一個接收int類型的參數,一個接收double類型的參數。MoreCalculation類繼承自Calculation類,並重寫了add(int a, int b)方法。TestCalculation類中創建了一個MoreCalculation對象,並分別調用了add方法。

輸出結果如下:

4
3.0

可以看到,MoreCalculation類的add(int a, int b)方法返回的值為a + b + 1。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/286770.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-23 03:48
下一篇 2024-12-23 03:48

相關推薦

  • Python中new和init的區別

    new和init都是Python中常用的魔法方法,它們分別負責對象的創建和初始化,本文將從多個角度詳細闡述它們的區別。 一、創建對象 new方法是用來創建一個對象的,它是一個類級別…

    編程 2025-04-29
  • Sublime Test與Python的區別

    Sublime Text是一款流行的文本編輯器,而Python是一種廣泛使用的編程語言。雖然Sublime Text可以用於編寫Python代碼,但它們之間有很多不同之處。接下來從…

    編程 2025-04-29
  • Shell腳本與Python腳本的區別

    本文將從多個方面對Shell腳本與Python腳本的區別做詳細的闡述。 一、語法差異 Shell腳本和Python腳本的語法存在明顯差異。 Shell腳本是一種基於字符命令行的語言…

    編程 2025-04-29
  • Python中while語句和for語句的區別

    while語句和for語句是Python中兩種常見的循環語句,它們都可以用於重複執行一段代碼。然而,它們的語法和適用場景有所不同。本文將從多個方面詳細闡述Python中while語…

    編程 2025-04-29
  • Web程序和桌面程序的區別

    Web程序和桌面程序都是進行軟件開發的方式,但是它們之間存在很大的區別。本文將從多角度進行闡述。 一、運行方式 Web程序運行於互聯網上,用戶可以通過使用瀏覽器來訪問它。而桌面程序…

    編程 2025-04-29
  • TensorFlow和Python的區別

    TensorFlow和Python是現如今最受歡迎的機器學習平台和編程語言。雖然兩者都處於機器學習領域的主流陣營,但它們有很多區別。本文將從多個方面對TensorFlow和Pyth…

    編程 2025-04-28
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28
  • 麥語言與Python的區別

    麥語言和Python都是非常受歡迎的編程語言。它們各自有自己的優缺點和適合的應用場景。本文將從語言特性、語法、生態系統等多個方面,對麥語言和Python進行詳細比較和闡述。 一、語…

    編程 2025-04-28
  • Python與C語言的區別和聯繫

    Python與C語言是兩種常用的編程語言,雖然兩者都可以用於編寫軟件程序,但是它們之間有很多不同之處。本文將從多個方面對Python與C語言的區別和聯繫進行詳細的闡述。 一、語法特…

    編程 2025-04-28
  • Python中深拷貝和淺拷貝的區別

    本文將從以下幾個方面對Python中深拷貝和淺拷貝的區別做詳細的闡述,包括:拷貝的含義、變量和對象的區別、淺拷貝的示例、深拷貝的示例、可變對象和不可變對象的區別、嵌套的數據結構以及…

    編程 2025-04-28

發表回復

登錄後才能評論