Java dynamic dispatch concept exam questions
java動態分派概念
意義
考題
java動態分派概念意義
Java程式的動態分派(Dynamic Dispatching)概念,
- 這是多型的一個關鍵特點。
- 動態分派發生在運行時,當你有一個物件變數,它引用一個子類別的實例,但這個物件變數的型別是其父類別。在這種情況下,方法呼叫的實現取決於實際執行時所引用的物件的型別。
- 它使我們能夠在運行時決定要呼叫的方法的實際實現,根據物件的實際型別。
請用下例說明在 Java 程式語言裡,dynamic dispatching 的意義與運作方式。並且說明
最後印出的報表為何?(20 分)
import java.lang.*;
class test24 {
public static void main(String[] arg) {
B b = new C();
R r = new S();
System.out.println("r.m(b) = " + r.m(b) );
}
}
class A { }
class B extends A { }
class C extends B { }
class P {
int m(B x) { return 1; }
}
class Q extends P {
int m(A x) { return 2; }
}
class R extends Q {
int m(C x) { return 3; }
}
class S extends R {
int m(B x) { return 4; }
int m(C x) { return 5; }
}
答案
上面程式的UML 類別圖為
這個Java程式示例展示了動態分派(Dynamic Dispatching)的概念,這是多型的一個關鍵特點。動態分派發生在運行時,當你有一個物件變數,它引用一個子類別的實例,但這個物件變數的型別是其父類別。在這種情況下,方法呼叫的實現取決於實際執行時所引用的物件的型別。
在這個程式中,我們有一系列的類別 `A`、`B`、`C`、`P`、`Q`、`R` 和 `S`,每個類別都包含一個 `m` 方法,並且它們之間形成了繼承鏈。 `test24` 類別中創建了 `B` 和 `C` 的實例,並將它們分別賦值給 `A` 和 `R` 的參考變數。然後,它呼叫 `r.m(b)`,其中 `r` 是 `S` 的實例,並且 `b` 是 `C` 的實例。
現在,讓我們根據動態分派的運作方式來解釋最後印出的報表:
1. `r` 引用的物件實際上是 `S` 的一個實例。
2. `m` 方法呼叫是 `r.m(b)`,其中 `b` 實際上是 `C` 的一個實例。
3. Java 將根據被呼叫方法的物件的實際型別來選擇實際執行的方法。
4. 因此,Java 將選擇 `S` 類別中的 `int m(C x)` 方法,因為 `C` 是 `b` 的實際型別。
5. 所以最後印出的報表是 `r.m(b) = 5`。
R型別實際上為S類別的實例,S類別有兩個方法,實際上呼叫哪個,視傳入參數而定。(overload過載,重載),B型別實際上為C類別的實例,這時我們可以用C類別的實例來決定呼叫哪個m方法,最後印出r.m(b)=5。
這就是動態分派的運作方式,它使我們能夠在運行時決定要呼叫的方法的實際實現,根據物件的實際型別。
Comments
Post a Comment