【Java】《Java编程的逻辑》第4章 类的继承 笔记+感悟分享
1.繼承可以復(fù)用代碼,公共的屬性和行為可以放到父類(lèi)中,而子類(lèi)只需要關(guān)注子類(lèi)特有的就可以了;另一方面,不同子類(lèi)的對(duì)象可以更方便的被統(tǒng)一管理。
2.super可以引用父類(lèi)非私有的變量。
(這句話(huà)對(duì)于Java的非初學(xué)者倒是了解,主要是super確實(shí)不能引用父類(lèi)的私有屬性,這是不被允許的,這點(diǎn)需要注意呀)
3.可以說(shuō),多態(tài)和動(dòng)態(tài)綁定是計(jì)算機(jī)程序的一種重要的思維方式,使得操作對(duì)象的程序不需要關(guān)注對(duì)象的實(shí)際類(lèi)型,從而可以統(tǒng)一處理不同對(duì)象,但又能實(shí)現(xiàn)每個(gè)對(duì)象的特有行為。
4.靜態(tài)綁定在程序編譯階段就被確定,而動(dòng)態(tài)綁定則需要等到程序運(yùn)行時(shí)才能確定。
(多態(tài)對(duì)于面向?qū)ο蟮某鯇W(xué)者可能有點(diǎn)“玄學(xué)”,在我個(gè)人看來(lái):
首先,多態(tài)基于繼承,一般來(lái)講狹義上的多態(tài)是基于子類(lèi)繼承父類(lèi)體現(xiàn)出來(lái)的。
然后,看下面的一行代碼:
在李剛老師的《瘋狂Java講義》中,左邊的SuperClass被稱(chēng)為編譯時(shí)類(lèi)型,右邊的SubClass被稱(chēng)為運(yùn)行時(shí)類(lèi)型,如果馬俊昌老師的講解和李剛老師的講解結(jié)合一下,想來(lái)是不難以理解的)
5.實(shí)例變量、靜態(tài)變量、靜態(tài)方法、private方法,都是靜態(tài)綁定的。
6.當(dāng)有多個(gè)重名函數(shù)時(shí),在決定要調(diào)用哪個(gè)函數(shù)的過(guò)程中,首先是按照參數(shù)類(lèi)型進(jìn)行匹配的,換句話(huà)說(shuō),尋找在所有重載版本中最匹配的,然后才看變量的動(dòng)態(tài)類(lèi)型,進(jìn)行動(dòng)態(tài)綁定。
(注意在匹配的時(shí)候,如果有同類(lèi)型的單參數(shù)的和不定長(zhǎng)參數(shù)的兩個(gè)重載函數(shù)時(shí),使用匹配的單參數(shù)會(huì)優(yōu)先匹配單參數(shù)函數(shù),而不是不定長(zhǎng)函數(shù))
7.一個(gè)父類(lèi)變量能不能轉(zhuǎn)換成一個(gè)子類(lèi)變量,取決于這個(gè)父類(lèi)變量的動(dòng)態(tài)類(lèi)型(即引用的對(duì)象類(lèi)型)是不是這個(gè)子類(lèi)或者這個(gè)子類(lèi)的子類(lèi)。
(向下轉(zhuǎn)型的時(shí)候-instanceof要用好,防止運(yùn)行時(shí)異常java.lang.ClassCastException)
8.重寫(xiě)時(shí),子類(lèi)只能提升(或者保持)父類(lèi)方法的可見(jiàn)性(訪問(wèn)權(quán)限)而不能降低。
private < (默認(rèn))< protected < public
(這個(gè)要記得啊……也是常識(shí)……)
9.final修飾的不能被繼承。
(常識(shí)……)
10.繼承中,用好protected可以便于實(shí)現(xiàn)模板模式(一種設(shè)計(jì)模式),具體的實(shí)現(xiàn)由子類(lèi)提供。
11.繼承為什么具有破壞力呢?
主要是因?yàn)槔^承可能會(huì)破壞封裝,而封裝可以說(shuō)是程序設(shè)計(jì)的第一原則;另外,繼承可能沒(méi)有反映出is-a關(guān)系。
12.什么是封裝?
封裝就是隱藏實(shí)現(xiàn)細(xì)節(jié),提供簡(jiǎn)化接口。
使用者只需關(guān)注怎么使用而不需要關(guān)注內(nèi)部是怎么實(shí)現(xiàn)的。實(shí)現(xiàn)細(xì)節(jié)可以隨時(shí)修改而不影響使用者。函數(shù)是封裝,類(lèi)也是封裝。通過(guò)封裝,才能在更高的層次上考慮和解決問(wèn)題。可以說(shuō),封裝是程序設(shè)計(jì)的第一原則,沒(méi)有封裝,代碼之間就會(huì)存在著各種實(shí)現(xiàn)細(xì)節(jié)的依賴(lài),這在構(gòu)建和維護(hù)復(fù)雜程序時(shí)是難以想象的。
13.繼承可能會(huì)破壞封裝是因?yàn)樽宇?lèi)和父類(lèi)可能存在著實(shí)現(xiàn)細(xì)節(jié)上的依賴(lài)。
子不知道父類(lèi)方法的實(shí)現(xiàn)細(xì)節(jié),就難以正確的進(jìn)行擴(kuò)展,甚至引發(fā)錯(cuò)誤。
子類(lèi)擴(kuò)展父類(lèi)的時(shí)候,僅僅知道父類(lèi)能做什么是不夠的,還需要知道父類(lèi)是怎么做的,而父類(lèi)的實(shí)現(xiàn)細(xì)節(jié)也不能隨意修改,否則可能影響子類(lèi)。
更具體地說(shuō),子類(lèi)需要知道父類(lèi)可重寫(xiě)方法之間的依賴(lài)關(guān)系,而且這個(gè)依賴(lài)關(guān)系,父類(lèi)不能隨意改變。
即使這個(gè)依賴(lài)關(guān)系不變,封裝還是可能會(huì)被破壞。
父類(lèi)不能隨意設(shè)置public方法,因?yàn)榻o父類(lèi)增加public方法就是在給所有子類(lèi)增加,而子類(lèi)可能必須要重寫(xiě)該方法才能保證方法的正確性。
總結(jié)一下:
對(duì)于子類(lèi)而言,通過(guò)繼承實(shí)現(xiàn)是沒(méi)有安全保障的,因?yàn)楦割?lèi)修改內(nèi)部實(shí)現(xiàn)細(xì)節(jié),它的功能就可能會(huì)被破壞;而對(duì)于父類(lèi)而言,讓子類(lèi)繼承和重寫(xiě)方法,就可能喪失隨意修改內(nèi)部實(shí)現(xiàn)的自由。
11.繼承是用來(lái)反映is-a關(guān)系的,但是Java并沒(méi)辦法約束,父類(lèi)有的屬性和行為,子類(lèi)不一定都適用,子類(lèi)還可以重寫(xiě)父類(lèi)的方法,實(shí)現(xiàn)與父類(lèi)預(yù)期完全不一樣的行為。
但對(duì)于父類(lèi)引用操作子類(lèi)對(duì)象的程序而言,它是把對(duì)象當(dāng)做父類(lèi)對(duì)象來(lái)看待的,期望對(duì)象符合父類(lèi)中聲明的屬性和行為。如果不符合,結(jié)果是什么呢?混亂。
總結(jié)
以上是生活随笔為你收集整理的【Java】《Java编程的逻辑》第4章 类的继承 笔记+感悟分享的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Java】《Java编程的逻辑》第3章
- 下一篇: 【算法分析与设计】鸡尾酒排序