1. 程式人生 > >JAVA-初步認識-第十章-多態-轉型2

JAVA-初步認識-第十章-多態-轉型2

圖解 能夠 技術 變化 images style 現在 數據類型的轉換 創建

一.

之前的舉的例子,Animal a=new Cat(); 當動物的引用指向了貓對象的時候,這時候貓對象具備了兩種形態。要麽是貓的形態,要麽是動物的形態。這時候,貓對象就具備了多態性。當父類指向子對象,這是一種提升。這叫向上轉型。轉成了動物類型。如果需要子類來進行操作的話,就需要向下轉型。

現在再舉一個例子來講述多態的轉型。

技術分享

(這個例子有點小問題,子類中具備兩個“講課”方法,方法體不一樣)

按道理說,我們是創建畢老師對象,調用畢老師方法。

技術分享

上面截圖中的都是早期操作,接下來講述多態的操作。

技術分享

舉本例能夠更加將多態講解清楚,比例舉的動物例子更加清晰。在本例的多態操作中,編譯運行的結果是java。我以為輸出的會是管理,沒想到輸出的java。這裏對畢老師和畢姥爺中的兩個一樣的函數做個介紹,畢老師繼承了畢姥爺,這樣一來,相同的方法子類就覆蓋了父類。如果父類中是個抽象類,相同的函數會多一個abstract的關鍵字,沒有方法體,但是子類中的函數依舊會覆蓋它。

這裏輸出java的原因在於,雖然x是畢姥爺類型,但是在內存圖解中,給x的值,卻是子類對象畢老師的地址編碼。因此,x輸出的講課就是子類對象中的講課,就是java,而不是父類畢姥爺中的講課管理。

技術分享

對程序進行了修改,發現我理解錯了。

技術分享

技術分享

按照之前的理解,這裏應該就不存在釣魚的功能,因為x本質上是子類對象,子類中不存在釣魚的功能。

→對於繼承的理解還是不夠深刻,我的視線全部集中在了相同函數的覆蓋上。我以為子類畢老師只有兩個功能,講課和看電影。實際上,對於父類中的一切,子類只要是繼承,子類中也是有的,只是沒有寫出來,也就是釣魚這個功能,子類中也是有的。如果是相同的聲明的函數,子類函數的方法體會覆蓋父類函數中的方法體。

再對程序進行一個修改,如下

技術分享

新增了一個x.看電影();這句話。我第一感覺也是可以運行的,但實際是錯誤的。還是因為前面的理解不夠深刻正確。外界一直將x當成畢姥爺來看待,覆蓋看不出來,子類中擴展的也看不出來。因此,外界壓根就無法調用看電影這個函數。(看電影函數在x中是真實存在的,那怎麽使用呢?難道非要轉換成子類類型才可以麽?)

想看電影,就用到了子類的特有數據。這就必須進行數據類型的轉換。

技術分享

整體的流程下來,截圖是這樣的

技術分享

多態的上下轉型過程中,有一個東西不會變,自始自終都是子類對象在做著變化。

要牢記,向上轉型有兩個作用,提高擴展性和限制子類的特有功能。在向下轉換類型的時候,一定要註意防止出現類型轉換異常。

JAVA-初步認識-第十章-多態-轉型2