1. 程式人生 > >多態,動態方法調度(dynamic method dispatch)?

多態,動態方法調度(dynamic method dispatch)?

sting blank 源碼 note type 而不是 這一 問題 類指針

8.多態Polymorphism,向上轉型Upcasting,動態方法調度(dynamic method dispatch) (視頻下載) (全部書籍)

什麽叫多態?簡言之,馬 克 - t o - w i n:就是父類引用指向子類時,父類和子類必須同時擁有某個同名函數,父類引用到底指向誰(調用誰的函數),是在runtime時決定的,因此呈現多種狀態(不知道會指向若幹子類中的哪一個還是父類自己)。拿上一節的例子來講,比如運行時如果用戶輸入自行車,就執行自行車的駕駛方法。如果用戶輸入小轎車,就執行小轎車的駕駛方法, 涉及到用戶,這些都只能在運行時才能幹。運行時的,就是動態的,所以這也是動態方法調度(dynamic method dispatch), 既然是父類指針指向子類,這也是向上轉型Upcasting(為什麽是向上?看我本章的第一張圖:父類 fuLei=(父類)

new 子類(); ,,,,感覺到一種向上轉型的意味嗎?子類 zilei=(子類)fulei; 這是向下轉型)。順便提一句。馬克-to-win:學術界另有一種說法,overload也算多態。我認為這只是學術上的一種說法而已,張三愛這麽認為,李四愛那麽認為,無所謂對錯。不像語法錯誤,錯了,編譯器真不讓你通過。不過本書作者不支持這種overload說法。

多態有什麽用?馬 克 - t o - w i n:(視頻下載) (全部書籍)我給大家想了兩個需求: 1)要求程序運行起來以後,如果用戶輸入自行車,就執行自行車的駕駛方法。如果用戶輸入小轎車,就執行小轎車的駕駛方法。這是就用到父類指針指向子類時的override。2)如果你有一千個子類。要求你依次執行這一千個子類當中的打印。你當然可以一個一個實例化子類後分別執行。馬克-to-win:累也累死了,你可以編一個循環。用通用的基類指向所有的派生類。幾行程序即可,你可以參照本節的例子。不用這技術, 還真解決不了這問題!

Polymorphism means one type,many form

Dynamic method binding(dynamic method dispatch),方法覆蓋僅在兩個方法的名稱和類型聲明都相同時才發生(override)。

動態方法調度(dynamic method dispatch)是一種在運行時而不是編譯時調用方法的機制。
動態方法調度也是Java實現運行時多態性的基礎。 馬克-to-win:要想實現多態,父類和子類必須同時擁有這個同名函數。否則實現不了多態, 底下給出了例子,說明這點。note that when
1)base pointer point to derived class to realize dynamic dispatching,an important requirement is that you also need to
have the same-name method in the base class.refer to the following example of SuperClass.


抽象類和非抽象類二者都可以用來創建對象引用,馬克-to-win:用來指向一個子類對象,實現多態。note that abstract and non-abstract class both can dynamically bind for example the following example.

例1.8.1---本章源碼

abstract class FigureMark {
double dime1;
double dime2;
/*這裏的構造函數,是為子類調用使的,不是用來實例化的。馬克-to-win: constructor is for subclass‘s constructor‘s calling, not for
instantiating. */
FigureMark(double a, double b) {
dime1 = a;
dime2 = b;
}
// area is now an abstract method
abstract void area();
}
class RectangleMark extends FigureMark {
RectangleMark(double a, double b) {
super(a, b);
}
// 覆蓋
void area() {

。。。。。。。。。。。。
詳情請見:http://www.mark-to-win.com/index.html?content=JavaBeginner/javaUrl.html&chapter=JavaBeginner/JavaBeginner3_web.html#Polymorphism

多態,動態方法調度(dynamic method dispatch)?