例子:
class
base
}class
sonextends
base
public
void
methodb()
}public
class
test01
}
編譯不通過
關於多型的問題,可以大體概括為:
編譯看左邊,執行看右邊。意思編譯時候,看左邊有沒有該方法,執行的時候結果看 new 的物件是誰,就呼叫的誰。
多型就是指程式中定義的引用變數所指向的具體型別和通過該引用變數發出的方法呼叫在程式設計時並不確定,而是在程式執行期間才確定,即乙個引用變數倒底會指向哪個類的例項物件,該引用變數發出的方法呼叫到底是哪個類中實現的方法,必須在由程式執行期間才能決定。因為在程式執行時才確定具體的類,這樣,不用修改源程式**,就可以讓引用變數繫結到各種不同的類實現上,從而導致該引用呼叫的具體方法隨之改變,即不修改程式**就可以改變程式執行時所繫結的具體**,讓程式可以選擇多個執行狀態,這就是多型性。
比如你是乙個酒神,對酒情有獨鍾。某日回家發現桌上有幾個杯子裡面都裝了白酒,從外面看我們是不可能知道這是些什麼酒,只有喝了之後才能夠猜出來是何種酒。你一喝,這是劍南春、再喝這是五糧液、再喝這是酒鬼酒…. 在這裡我們可以描述成如下:
酒 a = 劍南春
酒 b = 五糧液
酒 c = 酒鬼酒
這裡所表現的的就是多型。劍南春、五糧液、酒鬼酒都是酒的子類,我們只是通過酒這乙個父類就能夠引用不同的子類,這就是多型 —— 我們只有在執行的時候才會知道引用變數所指向的具體例項物件。
誠然,要理解多型我們就必須要明白什麼是 「向上轉型」。在繼承中我們簡單介紹了向上轉型,這裡就在囉嗦下:在上面的喝酒例子中,酒(win)是父類,劍南春(jnc)、五糧液(wly)、酒鬼酒(jgj)是子類。我們定義如下**:
jnc a = new jnc();
對於這個**我們非常容易理解無非就是例項化了乙個劍南春的物件嘛!但是這樣呢?
wine a = new jnc();
在這裡我們這樣理解,這裡定義了乙個 wine 型別的 a,它指向 jnc 物件例項。由於 jnc 是繼承與 wine,所以 jnc 可以自動向上轉型為 wine,所以 a 是可以指向 jnc 例項物件的。這樣做存在乙個非常大的好處,在繼承中我們知道子類是父類的擴充套件,它可以提供比父類更加強大的功能,如果我們定義了乙個指向子類的父類引用型別,那麼它除了能夠引用父類的共性外,還可以使用子類強大的功能。
但是向上轉型存在一些缺憾,那就是它必定會導致一些方法和屬性的丟失,而導致我們不能夠獲取它們。所以父類型別的引用可以呼叫父類中定義的所有屬性和方法,對於只存在與子類中的方法和屬性它就望塵莫及了
public
class
wine
public
void
fun2()
}public
class
jncextends
wine
/** * 子類重寫父類方法
* 指向子類的父類引用呼叫fun2時,必定是呼叫該方法
*/public
void
fun2()
}public
class
test}--
----
----
----
----
----
----
----
----
----
----
-------
output:
wine 的fun...
..jnc 的fun2.
..
從程式的執行結果中我們發現,a.fun1 () 首先是執行父類 wine 中的 fun1 (). 然後再執行子類 jnc 中的 fun2 ()。
分析:在這個程式中子類 jnc 過載了父類 wine 的方法 fun1 (),重寫 fun2 (),而且過載後的 fun1 (string a) 與 fun1 () 不是同乙個方法,由於父類中沒有該方法,向上轉型後會丟失該方法,所以執行 jnc 的 wine 型別引用是不能引用 fun1 (string a) 方法。而子類 jnc 重寫了 fun2 () ,那麼指向 jnc 的 wine 引用會呼叫 jnc 中 fun2 () 方法。
所以對於多型我們可以總結如下:
指向子類的父類引用由於向上轉型了,它只能訪問父類中擁有的方法和屬性,而對於子類中存在而父類中不存在的方法,該引用是不能使用的,儘管是過載該方法。若子類重寫了父類中的某些方法,在呼叫該些方法的時候,必定是使用子類中定義的這些方法(動態連線、動態呼叫)。
對於物件導向而已,多型分為編譯時多型和執行時多型。其中編輯時多型是靜態的,主要是指方法的過載,它是根據引數列表的不同來區分不同的函式,通過編輯之後會變成兩個不同的函式,在執行時談不上多型。而執行時多型是動態的,它是通過動態繫結來實現的,也就是我們所說的多型性。
java多型知識點總結
多型 一種事物有多種表現形式。物件導向的最後乙個特徵,繼承和封裝都是為多型打基礎!生活中的多型 打招呼 中國人 你好 英國人 hello 日本人 拷逆七娃 南韓人 阿娘哈賽you 泰國人 薩瓦迪卡 1 方法的多型性 方法的重寫和過載 2 物件的多型性 物件的轉型上!person p new stud...
JAVA知識點總結(七)多型
多型 可以理解為事物存在的多種體現形態 人 男人,女人 動物 貓,狗 貓 x new 貓 動物 x new 貓 動物貓,狗 1.多型的體現 父類的引用指向了自己子類的物件 父類的引用也可以接收自己子類的物件 2.多型的前提 必須是類與類之間的關係,要麼繼承,要麼實現 3.多型的好處 多型的出現大大的...
多型知識點
多型知識點總結如下 1 含有純虛函式的類稱為抽象類 2 抽象類不可以實現例項化 3 繼承抽象類的函式如果沒有實現所有的純虛函式也為抽象類 4 純虛函式的實現格式 virtual void print 0 5 繼承類在實現純虛函式時,可以略去關鍵字virtual,但一般建議必寫 便於維護 6 乙個虛函...