阿摩線上測驗 登入

申論題資訊

試卷:104年 - 104 鐵路特種考試_高員三級_資訊處理:程式語言#22432
科目:程式語言
年份:104年
排序:0

申論題內容

二、請用下例說明在 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; }

詳解 (共 1 筆)

詳解 提供者:hchungw
在 Java 程式語言裡,dynamic dispatching(動態分派)的意義與運作方式是指在執行期決定要呼叫哪一個方法,而不是在編譯期決定。這個機制主要是透過覆寫方法(method overriding)來實現的。動態分派允許子類別覆寫父類別的方法,並根據實際物件的類型來呼叫適當的方法實現。
在這個範例中,程式碼如下:
java
複製程式碼
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; }
}
讓我們一步步來看這個程式是如何執行的:
B b = new C();
這行程式碼創建了一個 C 類型的物件,但使用 B 類型的變數來參考它。這表示 b 是一個實例化為 C 的 B 類型物件。
R r = new S();
這行程式碼創建了一個 S 類型的物件,但使用 R 類型的變數來參考它。這表示 r 是一個實例化為 S 的 R 類型物件。
System.out.println("r.m(b) = " + r.m(b));
這行程式碼呼叫 r 的 m 方法,並傳遞 b 作為參數。我們需要確定 r.m(b) 呼叫了哪一個 m 方法。
在動態分派中,Java 會根據 r 的實際類型來決定呼叫哪一個方法。在這裡,r 是 S 類型,因此會檢查 S 類中的方法簽名是否匹配。如果匹配,則呼叫 S 類中的方法。
r.m(b) 會檢查 S 類中的方法。由於 b 的實際類型是 C,並且 S 類有 int m(B x) 和 int m(C x) 這兩個方法,Java 會選擇最匹配的那一個方法。在這種情況下,因為 b 是 C 類型的物件,所以 int m(C x) 方法會被選擇,返回值是 5。
因此,最後印出的報表為:
css
複製程式碼
r.m(b) = 5
這展示了動態分派如何根據實際物件類型來決定呼叫哪一個方法。