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