java多態

 

面向對象之多態(瘋狂Java講義學習心得)

爲什麼會出現多態?

Java 中的引用變量有兩個類型,一個是編譯時的類型,一個是運行時的類型,編譯時的類型由聲明該變量時使用的類型決定,運行時的類型由實際賦給該變量的對象決定。如果編譯時的類型與運行時的類型不一致就會出現所謂的多態。(Polymorphism)

例題如下:

 

現實生活中也有多態的原型:例如一個父親F有兩個孩子S1和S2,而父親又可以代表孩子做一些事情,即F即可以代表S1也可以代表S2,因此F具有一定的多態性。在Java中多態大多是指對象變量的多態,即一個F類型的變量既可以指向F類型的對象也可以指向S1、S2類型的對象。(F與S1、S2之間需要存在繼承關係)

注意:除了上述多態形式外,一個接口類型變量也可以指向其實現類的實例,這也是多態的一種表現。

(參考:《你必須知道的261個Java問題》)

哈哈,上面的這幅圖是不是很形象?吃糖相當於方法,而年齡則相當與屬性。

關於強制類型轉換

基本類型之間的強制轉換只能在數值之間進行,這裏所說的數值類型包括整數型、字符型和浮點型。但數值型不能和布爾型之間進行轉換。

引用類型之間的轉換隻能把一個父類變量轉換成子類類型,如果兩個沒有繼承關係的類型,則無法進行類型轉換,否則編譯時會出現錯誤。如果試圖把一個父類實例轉換子類類型,則必須這個對象實際上是子類才行(即編譯時類型爲父類類型,而運行時類型是子類類型),否則在運行時會發生ClassCastException異常。

爲了避免出現ClassCastException異常,可以使用instance of運算符判斷是否可以轉型成功。前面的程序可以加上:

If(objStr instanceof String){

String str=(String) objPri;

}

注意點:

當把子類對象賦給父類時,被稱爲向上轉型(upcasting),這種轉型總是可以完成的,這也從一個側面證明了子類是一種特殊的父類。這種轉型只是表明這個引用變量的編譯類型是父類,但實際執行他的方法時,依然表現出子類對象的行爲方式。但把一個父類對象賦給子類引用變量時,就需要進行強制類型轉換。

instanceof 運算符的前一個數通常是一個引用類型的變量,後一個操作數通常是一個類(也可以是接口,可以把接口理解成一種特殊的類),它用於判斷前面的對象是否是後面的類,或者其子類、實現類的實例。如果是則返回true,否則返回false。

使用instanceof 運算符事應該注意,前面的操作數的編譯類型要麼與後面的類相同,要麼是後面類的父類,否則會引起編譯錯誤。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章