《疯狂Java讲义》4
目錄
類的繼承
1.繼承的特點:
2.重寫父類的方法(override,也稱為方法覆蓋):
3.super
Polymorphism
類的繼承
1.繼承的特點:
(1)?java的繼承具有單繼承的特點,每個子類只有一個直接父類。
(2)?父類也稱為超類、基類。用extends作為繼承的關鍵字。
(3)注意:Java的子類不能獲得父類的構造器。
2.重寫父類的方法(override,也稱為方法覆蓋):
????遵循“兩同兩小一大”原則:“兩同”:方法名相同,形參列表相同;“兩小”:子類方法返回值類型比父類方法返回值類型更小或者相等、子類方法聲明拋出的異常類比父類方法聲明拋出的異常類更小或者相等;“一大”:子類方法的訪問權限比父類方法的訪問權限更大或者相等。
舉個栗子:
?
結果如下:
????上次我們說道過,方法重載只需要方法名一樣,修飾類型可以不同,但在這里要注意一點:如果父類的方法是static修飾的(類方法),子類的方法也應該是static修飾的(類方法)。當子類覆蓋了父類方法之后,子類的對象將永遠不能訪問父類中被覆蓋的方法,但是可以調用父類中被覆蓋的方法(用super或者父類類名作為調用者)。
舉個栗子: ? ?
?
結果如下:
????還要注意一點:如果父類中的方法是用的private進行修飾的,那么即使子類和父類方法、修飾類型等等完全相同,也不是對父類方法的重寫,相當于自己沖洗定義了一個方法,只不過巧了,父類中也有這個方法。
3.super
????上面實際上已經說了super的用法。這里提一點,super調用的是實例的方法或者變量而不是類方法或者變量。如果想調用類方法或類變量,應該使用父類類名作為調用者。
多態
Polymorphism
1.?Java引用變量有兩個類型,一個是編譯類型,一個是運行時類型。編譯時類型由聲明該變量時使用的類型來決定,運行時類型由實際賦給該變量的對象來決定,如果編譯時類型和運行時類型不一致,就可能出現所謂的多態。
我們通過栗子來進一步了解:
?
在第47行加了注釋以后輸出的結果如下:
如果加上這行注釋,會報錯:
下面解釋一下上面的代碼:
首先要知道什么事編譯時類型和運行時類型,其實顧名思義即可,給個例子更好理解:
(1)在main()方法中顯示的創建了三個引用變量,對于前兩個引用變量bs和sc,因為編譯時變量和運行時變量相同,所以調用它們的成員變量和方法都是正常的。
(2)第三個引用變量較為特殊,如上圖,編譯時類型為BaseClass,運行時類型是SubClass,在調用test方法時,由于子類重寫過父類的了,所以用的還是子類的,但是變量(book)還是父類的,而下面的sub方法,因為在父類中沒有,所以會報錯,這就是說,引用變量只能調用它的編譯時變量,不能調用運行時變量。這里要注意,實例變量不具有多態性,按照編譯時狀態走;方法具有多態性。
2. 下面說個好玩的東西:instanceof運算符
????上面我們說道,引用變量只能調用它的編譯時變量,不能調用運行時變量,可是如果想讓程序調用運行時變量怎么辦?——強制轉換,那這里就遇到問題了,我們都知道強制轉換怎么個轉換方法,當然也清楚,強制轉換可能會有問題:
(1)基本類型之間的轉換只能在數值之間進行,但是數值類型與布爾類型之間不能進行轉換;
(2)引用類型之間的轉換是在有繼承關系的兩個類型之間。
????考慮到進行強制類型轉換時可能出現異常,因此進行類型轉換之前應該先通過instanceof運算符進行判斷,看是否可以成功轉換。
instanceof
????instanceof ?運算符的前一個操作數通常是一個引用型變量,后面通常是一個類。它用于判斷前面的對象是否是后面的類的子類或者實例。如果是,返回true,否則,返回false。
????在使用instanceof 運算符時注意,運算符前面的編譯類型與后面的類要么相同,要么具有繼承關系,否則會編譯錯誤。
舉個栗子說instanceof的用法:
?
結果如下:
?
END
? ? 【2017.07.17】好了,今天Java就學到這里吧,第五章完了,準備第六章,迫不及待想玩后面的界面。昨天沒有弄競賽題,今天不能拖了,加油吧!早上上課,專注了3個小時,收獲頗豐,老師講的每一句都帶上了自己的思考,還是很喜歡這樣的感覺的,小學期的任務主要是做CPU和狀態機,不知道自己行不行,just try it!話說回來,這個其實離不開之前備考時對計組理的認真思考與體會,果然一分耕耘一份收獲,看來知識還是學通透了好啊。放假了,但是對我而言,沒有假期!!!FIGHTING!!!
總結
以上是生活随笔為你收集整理的《疯狂Java讲义》4的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《疯狂JAVA讲义》3
- 下一篇: 《疯狂Java讲义》5