Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤與異常

Java 多執行緒

Java 同步

Java 網路程式設計

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 雜項

Java API 和框架

Java 類引用

Java 有用資源

Java - 方法重寫



在上一章中,我們討論了超類和子類。如果一個類繼承了其超類的方法,那麼就有可能重寫該方法,前提是該方法沒有被標記為 final。

Java 中重寫的益處

重寫的益處是:能夠定義特定於子類型別的行為,這意味著子類可以根據其需求實現父類方法。

面向物件術語中,重寫意味著重寫現有方法的功能。

Java 方法重寫

方法重寫允許我們實現執行時多型性,並用於編寫已經在超類中定義的子類方法的特定定義。

超類中的方法和子類中被重寫的方法應該具有相同的宣告簽名,例如引數列表、型別和返回型別。

Java 方法重寫的用法

以下是 Java 中方法重寫的兩個重要用法:

  • 方法重寫用於實現執行時多型性。
  • 方法重寫用於編寫子類方法的特定定義(此方法稱為被重寫方法)。

Java 方法重寫的示例

讓我們來看一個例子。

class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal a = new Animal();   // Animal reference and object
      Animal b = new Dog();   // Animal reference but Dog object

      a.move();   // runs the method in Animal class
      b.move();   // runs the method in Dog class
   }
}

輸出

Animals can move
Dogs can walk and run

在上面的例子中,你可以看到,即使b是 Animal 型別,它也會執行 Dog 類中的 move 方法。原因是:在編譯時,檢查是在引用型別上進行的。但是,在執行時,JVM 會確定物件型別,並執行屬於該特定物件的方法。

因此,在上面的示例中,程式將正確編譯,因為 Animal 類具有 move 方法。然後,在執行時,它會執行特定於該物件的方法。

考慮以下示例:

示例

class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      System.out.println("Dogs can walk and run");
   }
   public void bark() {
      System.out.println("Dogs can bark");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal a = new Animal();   // Animal reference and object
      Animal b = new Dog();   // Animal reference but Dog object

      a.move();   // runs the method in Animal class
      b.move();   // runs the method in Dog class
      b.bark();
   }
}

輸出

TestDog.java:26: error: cannot find symbol
      b.bark();
       ^
  symbol:   method bark()
  location: variable b of type Animal
1 error

此程式將丟擲編譯時錯誤,因為 b 的引用型別 Animal 沒有名為 bark 的方法。

方法重寫的規則

  • 引數列表必須與被重寫方法的引數列表完全相同。

  • 返回型別應該與超類中原始被重寫方法宣告的返回型別相同或為其子型別。

  • 訪問級別不能比被重寫方法的訪問級別更嚴格。例如:如果超類方法宣告為 public,則子類中的重寫方法不能是 private 或 protected。

  • 例項方法只有在被子類繼承時才能被重寫。

  • 宣告為 final 的方法不能被重寫。

  • 宣告為 static 的方法不能被重寫,但可以被重新宣告。

  • 如果一個方法不能被繼承,那麼它就不能被重寫。

  • 與例項的超類位於同一包中的子類可以重寫任何未宣告為 private 或 final 的超類方法。

  • 不同包中的子類只能重寫宣告為 public 或 protected 的非 final 方法。

  • 重寫方法可以丟擲任何未檢查異常,無論被重寫方法是否丟擲異常。但是,重寫方法不應丟擲比被重寫方法宣告的異常更新或更廣泛的已檢查異常。重寫方法可以丟擲比被重寫方法更窄或更少的異常。

  • 建構函式不能被重寫。

Java 方法和建構函式重寫

在 Java 中,每個類都有不同的名稱,建構函式的名稱與類名相同。因此,我們不能重寫建構函式,因為它們不能具有相同的名稱。

Java 方法重寫:使用 super 關鍵字

呼叫被重寫方法的超類版本時,使用super關鍵字。

示例:使用 super 關鍵字

class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      super.move();   // invokes the super class method
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal b = new Dog();   // Animal reference but Dog object
      b.move();   // runs the method in Dog class
   }
}

輸出

Animals can move
Dogs can walk and run
廣告