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

Popular posts from this blog

How to write data into a excel file using vbscript

Format date as yyyy-mm-dd using vbscript