HOWTO · Java

Java 中的動態方法排程

本教程展示了 Java 中動態方法分派的定義、優勢和使用。

本頁內容

本教程介紹了 Java 中的動態方法分派。它講述了它的技術定義和重要性,並用程式碼示例進行了解釋。

Java 中的動態方法排程

讓我們把這些詞拆開,把排程視為決定呼叫哪個函式(方法)。動態一詞表明它是在執行時確定的。

用最簡單的話來說,我們可以說應該執行哪個函式/方法是在執行時決定的。

考慮到技術定義,動態方法分派(也稱為執行時多型性)是一種用於在執行時而不是編譯時解析對覆蓋方法的呼叫的機制。

當我們使用引用在子類中呼叫被覆蓋的方法時,Java 會根據它所引用的物件的型別來決定執行哪個方法。讓我們通過以下兩個程式碼截圖來理解定義。

關注以下螢幕截圖,其中我們有三個類,分別名為 Shape、Rectangle 和 Main 類。Shape 是超類,Rectangle 是子類。

main 方法具有 Shape 和 Rectangle 型別的兩個物件,並將它們的引用儲存在 shape 和 rectangle 變數中。

這些變數呼叫各自類的 display() 方法。例如,如果我們呼叫 shape.display(),將在編譯時決定呼叫 Shape 類的 display(),因為 shape 包含 Shape 類的引用。

java 中的動態方法分派——定義第一部分

現在,改變下面截圖中的程式碼。這裡,main 方法包含兩個物件,一個用於 Shape 類,另一個用於 Rectangle 類,但兩者(變數 shape 和 rectangle)都包含 Shape 類的引用.

那麼,程式如何決定哪個過載方法應該被呼叫?這就是動態方法分派發揮作用的地方。

在這裡,Java 根據它所引用的物件的型別來確定應該執行哪個方法。

如果物件是 Rectangle 型別,則呼叫 Rectangle 類的 display(),如果物件是 Shape 型別,則呼叫 Shape 的 display() 方法類將被呼叫。所有這些決定都是在執行時做出的。

這就是我們所說的執行時多型性或動態方法分派。

java 中的動態方法分派——定義第二部分

Java 中動態方法排程的重要性

以下幾點增加了使用動態方法分派的重要性。

  1. 動態方法分派讓 Java 支援執行時多型所必需的方法覆蓋。
  2. 它讓子類合併他們的功能並根據專案需求更新實現。
  3. 它讓超類定義一個與其子類共享的函式/方法,並允許這些子類更新函式的實現。

Java 中的動態方法排程與程式碼示例

示例程式碼:

class Shape {
  Shape() {}
  void display() {
    System.out.println("I am in the Shape class");
  }
}

class Rectangle extends Shape {
  Rectangle() {}
  void display() {
    System.out.println("I am in the Rectangle class");
  }
}

class Triangle extends Shape {
  Triangle() {}
  void display() {
    System.out.println("I am in the Triangle class");
  }
}

public class Main {
  public static void main(String args[]) {
    Shape rectangle = new Rectangle();
    Shape triangle = new Triangle();

    rectangle.display();
    triangle.display();
  }
}

輸出:

I am in the Rectangle class
I am in the Triangle class

在這裡,Rectangle 和 Triangle 類擴充套件了 Shape 類。這些類有一個 display() 方法,我們應該稱之為 main 方法。

main 方法有兩個物件,一個用於 Rectangle 型別,另一個用於 Triangle 型別,但引用變數 rectangle 和 triangle 引用同一個名為 Shape 的父類。

如何找出將呼叫哪個函式?在這裡,動態排程方法出現了。

請記住,我們還在以下兩個程式碼中使用了動態繫結和向上轉換。

Shape rectangle = new Rectangle();
Shape triangle = new Triangle();

動態繫結使用物件(類的例項,這裡是 new Rectangle() 和 new Triangle())在執行時解析方法呼叫。

這裡也使用向上轉換,因為父類引用變數(rectangle 和 triangle)正在引用子類 Rectangle 和 Triangle。