Head First Java學(xué)習(xí):第七章-繼承和多態(tài)
第七章:繼承和多態(tài)
1、 覆蓋(override)
覆蓋的意思是由子類重新定義繼承下來的方法,以改變或延伸此方法的行為。
2、 繼承(extends)
類的成員:實(shí)例變量+方法
實(shí)例變量無法覆蓋是因?yàn)椴恍枰鼈儧]有定義特殊的行為。
繼承的關(guān)系意味著子類可以繼承了父類的成員,包含實(shí)例變量和方法。
用繼承可以防止子類中出現(xiàn)重復(fù)的程序代碼。
繼承調(diào)用哪個(gè)方法: 對(duì)于繼承的“層次樹”,java虛擬機(jī)從層次樹的最下方開始找,找不到就會(huì)往上尋找直到找到為止。
IS-A:測(cè)試?yán)^承
如果類Y是繼承類X,且類Y是類Z的父類,那么: Y IS-A X ;Z IS-A Y ;Z IS-A X。
3、 super:
在子類中還打算引用父類的方法然后加上額外行為。 可以做在父類中設(shè)計(jì)出所有子類都使用的功能實(shí)現(xiàn),讓子類可以不用完全覆蓋掉父類的功能,只是再加上額外的行為,可以通過 super這個(gè)關(guān)鍵字取用父類。
舉例:
public void roma(){
super.roma(); // 會(huì)先執(zhí)行super版的roma(),然后再回來執(zhí)行自定義的功能或行為
// my own roma stuff
}
4、 存取權(quán)限(access level)
繼承中的存取權(quán)限: 父類可以通過存取權(quán)限決定子類是否能夠繼承某些特定的成員。
四種權(quán)限(限制從大到小):private、default、protected、public
存取權(quán)限控制了誰可以接觸什么。
* public 類型的成員會(huì)被繼承
* private 類型的成員不會(huì)被繼承
當(dāng)子類把成員繼承下來時(shí),會(huì)把它們當(dāng)作自己定義的一樣。
任一類的成員包含有:自己定義出的變量和方法+從父類繼承下來的任何東西
5、 繼承的意義
1) 避免了重復(fù)的程序代碼
2) 定義出共同的協(xié)議 類的方法就是”共同協(xié)議“
總結(jié):
* 子類是extends父類出來的
* 子類會(huì)繼承父類所有public類型的實(shí)例變量和方法,但不會(huì)繼承父類所有private類型的變量和方法
* 繼承下來的方法可以被覆蓋掉,但是實(shí)例變量不能被覆蓋掉
* 使用 IS-A 測(cè)試來驗(yàn)證繼承結(jié)構(gòu)的合理性
* IS-A 關(guān)系是單方向的
* 當(dāng)某個(gè)方法在子類下中被覆蓋過,調(diào)用這個(gè)方法時(shí),會(huì)調(diào)用覆蓋過的版本。
6、 多態(tài)是如何運(yùn)行的?
第一步:看一般聲明引用和創(chuàng)建對(duì)象的方法
Dog myDog = new Dog();
1) 聲明一個(gè)引用變量:
2) 創(chuàng)建對(duì)象
3) 連接對(duì)象和引用
重點(diǎn)在于引用類型和對(duì)象的類型必須相符。
第二步:在多態(tài)下,引用和對(duì)象可以是不同類型
Animal myDog = new Dog();
其中Animal 是 Dog的父類。
運(yùn)用多態(tài)時(shí),引用類型可以是實(shí)際對(duì)象類型的父類;參數(shù)和返回類型也可以多態(tài)。
什么是多態(tài):
概念就是同一操作作用于不同對(duì)象,可以有不同解釋,產(chǎn)生不同的執(zhí)行結(jié)果。多態(tài)是一種運(yùn)行期狀態(tài)。
多態(tài)的必要條件:
為了實(shí)現(xiàn)運(yùn)行期的多態(tài),需要滿足三個(gè)條件:
1)有類繼承,或者接口實(shí)現(xiàn)
2)子類要重寫父類的方法
3)父類的引用指向子類的對(duì)象
舉例:
public class Parent{ public void call(){ sout("in Parent"); } } public class Son extends Parent{ // 1.有類繼承或接口實(shí)現(xiàn) public void call(){ //2.子類重寫父類方法 sout("in Son"); } } public class Test{ public static void main(String[] args){ Parent p = new Son();// 3.父類的引用指向子類 } }
關(guān)于重寫:
重寫是指在java的子類和父類中有兩個(gè)名稱、參數(shù)列表都相同的方法的情況。由于她們具有相同的方法簽名,所以子類中的新方法將覆蓋父類中原有的方法。
7、 你能夠繼承任何一個(gè)類嗎?如果類的成員一樣,如果類時(shí)私有的,你就不能繼承?
答案:內(nèi)部類還沒正式介紹。除了內(nèi)部類,并沒有私有類這樣的概念,有三種方法可以防止某個(gè)類被作出子類。
第一種:存取控制,不標(biāo)記為公有。非公有類只能被同一個(gè)包的類作出子類。
第二種:final標(biāo)記符號(hào),表示它是繼承樹的末端,不能被繼承。
第三種:讓類只擁有private的構(gòu)造程序(constructor)
8、 為什么會(huì)作出標(biāo)識(shí):final的類,有什么好處?
一般來說,不會(huì)標(biāo)識(shí)出final,除非你需要安全。
9、 可不可以只用final去標(biāo)識(shí)方法,而不使用整個(gè)類?
如果你想防止特定的方法被覆蓋,可以將該方法標(biāo)識(shí)上 final 這個(gè)修飾符。將整個(gè)類標(biāo)識(shí)上 final 修飾符表示沒有任何方法可以被繼承。
10、 遵守合約:覆蓋的規(guī)則
當(dāng)你要覆蓋父類的方法時(shí),你就得同意履約。 方法就是合約的標(biāo)識(shí)。
* 參數(shù)必須一樣,且返回類型必須要兼容
子類使用的參數(shù) = 父類使用的參數(shù)。
子類聲明的返回類型或該類型的子類 = 父類聲明的返回類型
* 不能降低方法的存取權(quán)限
代表存取權(quán)限必須相同,或者更開放。比如,你覆蓋掉一個(gè)公有的方法并將它標(biāo)記為私有,這會(huì)讓它以為在編譯期通過的是個(gè)公有,然后突然在執(zhí)行期才被java虛擬機(jī)阻止存取。
11、 方法的重載(overload)
重載的意義:兩個(gè)方法名稱相同,但是參數(shù)不同。 所以重載和繼承、多態(tài)毫無關(guān)系。
* 返回的類型可以不同
* 不能只改變返回類型
如果只有返回類型不同,但參數(shù)一樣,這是不允許的,編譯器不會(huì)讓這樣的事情過關(guān)。就算是重載,也要讓返回類型是 父類版返回類型的子類。
* 可以更改存取權(quán)限
浙公網(wǎng)安備 33010602011771號(hào)