1. 程式人生 > >JAVA-初步認識-第八章-繼承-子父類中成員變量的特點-覆蓋的應用

JAVA-初步認識-第八章-繼承-子父類中成員變量的特點-覆蓋的應用

bsp 姓名 擴展 高程 繼承 cal 保留 hone blog

一.

覆蓋講解了好幾節,看來確實是個很重要的知識點。

其實我們最關心的不是覆蓋的特點和覆蓋的註意事項,這些小東西只要稍加註意,不寫錯就可以了。我們要註重什麽,什麽時候使用覆蓋操作,這是我們開發時,使用最頻繁的。

先不管什麽覆不覆蓋了,先用一個案例演示一遍。

先描述一個小事物,手機。手機有個功能就是來電顯示,早期的手機,顯示的只有num。編譯後,一運行,發現沒有任何問題。

技術分享

技術分享

技術分享

接下來,遇到一些問題。現在手機出來很多新的版本,來電顯示功能發生了一些變化,有顯示姓名和照片。我們要將這些東西加進來,

直接在原有的基礎上,加上一些新的內容。編譯運行沒有問題。

技術分享

但是有一些小問題,無論是name,還是picture都是後來的,把它們寫在一起,合適麽?不太合適,因為添加的name和pic相當於升級,這也是後期維護中的一部分。如果每次升級,都是修改源代碼的話,如果發現升級的不對,還得該回去,這就會造成修改成本。這樣就不利於該程序的擴展。而且,一升級就去修改代碼的話,往往修改的不是一處,是多處,就會給你的升級帶來災難,甚至是毀滅性的,等你改完,不一定能改回去。所以,一般情況下,我們不建議對源代碼進行修改,這樣最危險。因此,在設計的時候就變得很重要,如果設計不好,後面全都出現不行。

因此,我們可以這麽做,可以搞一個新類,newphone,它也是電話中的一種,讓它去繼承以前的phone就可以了,創建新的顯示方法,來顯示後期添加的東西。

技術分享

(這裏為什麽會有number的重復出現,是不是顯得有點多余?)

一樣是產生變化,但我們不準備去修改原來的類,直接通過一個類去繼承它。用繼承的方式來進行擴展。如果單獨設計個類,和之前的一點關系都沒有,會顯得很麻煩,因為這個phone類中還有其他功能是不需要修改的,比如說通話,從以前到現在,通話功能一直都是一樣的。也就是phone類中還有call()方法,你覺著newphone類中還需要重新定義麽?就不需要了,而且我們知道新的東西,就是老的類中的一種,為什麽不直接繼承call(),拿來用呢?只是show()方法變了。因此,用繼承就可以提高程序的擴展性。

技術分享

技術分享

技術分享

DOS結果顯示,沒有任何問題。看樣子是解決了問題,但是還有不爽。這個newphone繼承了phone,相當於繼承了父類中的兩個方法,意味著它也可以調用show(), 結果顯示是可以的,

技術分享

但是爽嗎?不爽了。子類出現以後,無非是為了改良父類中的來電顯示功能,但是它有必要更改來電顯示聲明嗎(這裏是說show的名字)?父類本身就有來電顯示的功能,子類只要繼承過來就可以了,但是呢?子類想說,這個功能,我可以保留,但是我想改變功能的內容(保留show方法聲明,但是裏面的執行內容要發生變化)。這該怎麽操作?沒必要定義新方法,新方法定義完以後,老方法一樣可以拿來用,而我要做的,就是把已有的來電顯示功能改良。

想改良做的最簡單的動作就是覆蓋,保留父類原有功能,創建子類特有內容。以前有來電顯示,我不喜歡,但是功能還得要,因為我也需要來電顯示,只是我的來電顯示的內容和你不一樣。

技術分享

只要創建的是子類的對象,那麽既能用show(), 也能用call(),p走的是子類的來電顯示,和phone走的不一樣,但也能走phone的call()。

技術分享

這裏還有一點要註意,子父類的方法中num寫了兩遍,

技術分享

為什麽不直接省略num這個語句呢?因為是覆蓋,如果省略了num語句,那麽調用子類的show()方法時,就沒有num輸出了。

JAVA-初步認識-第八章-繼承-子父類中成員變量的特點-覆蓋的應用