Java 中的動態方法排程
本教程介紹了 Java 中的動態方法分派。它講述了它的技術定義和重要性,並用程式碼示例進行了解釋。
Java 中的動態方法排程
讓我們把這些詞拆開,把排程
視為決定呼叫哪個函式(方法)。動態
一詞表明它是在執行時確定的。
用最簡單的話來說,我們可以說應該執行哪個函式/方法是在執行時決定的。
考慮到技術定義,動態方法分派(也稱為執行時多型性)是一種用於在執行時而不是編譯時解析對覆蓋方法的呼叫的機制。
當我們使用引用在子類中呼叫被覆蓋的方法時,Java 會根據它所引用的物件的型別來決定執行哪個方法。讓我們通過以下兩個程式碼截圖來理解定義。
關注以下螢幕截圖,其中我們有三個類,分別名為 Shape
、Rectangle
和 Main
類。Shape
是超類,Rectangle
是子類。
main
方法具有 Shape
和 Rectangle
型別的兩個物件,並將它們的引用儲存在 shape
和 rectangle
變數中。
這些變數呼叫各自類的 display()
方法。例如,如果我們呼叫 shape.display()
,將在編譯時決定呼叫 Shape
類的 display()
,因為 shape
包含 Shape
類的引用。
現在,改變下面截圖中的程式碼。這裡,main
方法包含兩個物件,一個用於 Shape
類,另一個用於 Rectangle
類,但兩者(變數 shape
和 rectangle
)都包含 Shape
類的引用.
那麼,程式如何決定哪個過載方法應該被呼叫?這就是動態方法分派發揮作用的地方。
在這裡,Java 根據它所引用的物件的型別來確定應該執行哪個方法。
如果物件是 Rectangle
型別,則呼叫 Rectangle
類的 display()
,如果物件是 Shape
型別,則呼叫 Shape
的 display()
方法類將被呼叫。所有這些決定都是在執行時做出的。
這就是我們所說的執行時多型性或動態方法分派。
Java 中動態方法排程的重要性
以下幾點增加了使用動態方法分派的重要性。
- 動態方法分派讓 Java 支援執行時多型所必需的方法覆蓋。
- 它讓子類合併他們的功能並根據專案需求更新實現。
- 它讓超類定義一個與其子類共享的函式/方法,並允許這些子類更新函式的實現。
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
。