《Java編程思想》筆記——面向?qū)ο蠛皖?lèi)

1财松、面向?qū)ο蟪绦蛟O(shè)計(jì)簡(jiǎn)介

面向?qū)ο笫且环N程序設(shè)計(jì)方法,或者是程序設(shè)計(jì)規(guī)范虎敦,其基本思想是使用對(duì)象游岳、類(lèi)政敢、繼承其徙、封裝、多態(tài)等基本概念來(lái)進(jìn)行程序設(shè)計(jì)喷户。 面向?qū)ο笫且环N符合人們思考習(xí)慣的思想唾那,可以將復(fù)雜的事情簡(jiǎn)單化,將程序員從執(zhí)行者轉(zhuǎn)換成了指揮者褪尝。
面向?qū)ο蟮奶卣鳎?br> ? 封裝(encapsulation)
? 繼承(inheritance)
? 多態(tài)(polymorphism)

2.java單繼承的優(yōu)點(diǎn):

相比于C++的多繼承闹获,java只支持類(lèi)的單繼承,java中的所有類(lèi)的共同基類(lèi)是Object類(lèi)河哑,Object類(lèi)java類(lèi)樹(shù)的唯一根節(jié)點(diǎn)避诽,這種單繼承有以下好處:

  1. 單繼承可以確保所有的對(duì)象擁有某種共同的特性,這樣對(duì)于JVM虛擬機(jī)對(duì)所有的類(lèi)進(jìn)行系統(tǒng)級(jí)的操作將提供方便璃谨,所有的java對(duì)象可以方便地在內(nèi)存堆棧中創(chuàng)建沙庐,傳遞參數(shù)也變的更加方便簡(jiǎn)單鲤妥。
  2. java的單繼承使得實(shí)現(xiàn)垃圾回收器功能更加容易,因?yàn)榭梢源_保JVM知道所有對(duì)象的類(lèi)型信息拱雏。

3.多態(tài):

在面向?qū)ο缶幊讨忻薨玻宇?lèi)中擁有和父類(lèi)相同方法簽名的方法稱為子類(lèi)方法覆蓋父類(lèi)方法,當(dāng)調(diào)用子類(lèi)方法的某個(gè)操作時(shí)铸抑,不必明確知道子類(lèi)的具體類(lèi)型贡耽,只需要將子類(lèi)類(lèi)型看作是父類(lèi)的引用調(diào)用其操作方法,在運(yùn)行時(shí)鹊汛,JVM會(huì)根據(jù)引用對(duì)象的具體子類(lèi)類(lèi)型而調(diào)用應(yīng)該的方法蒲赂,這就是多態(tài)。
多態(tài)不但能夠改善代碼的組織結(jié)構(gòu)和可讀性柒昏,還能夠創(chuàng)建可拓展性的程序凳宙。

多態(tài)的基礎(chǔ)是java面向?qū)ο缶幊痰耐斫壎C(jī)制。編程中有如下兩種綁定機(jī)制:

  1. 前期綁定:一般在非面向?qū)ο缶幊陶Z(yǔ)言中使用职祷,在程序編譯時(shí)即計(jì)算出具體調(diào)用方法體的內(nèi)存地址氏涩。
  2. 動(dòng)態(tài)綁定/運(yùn)行時(shí)綁定:面向?qū)ο缶幊陶Z(yǔ)言中經(jīng)常使用,在程序編譯時(shí)無(wú)法計(jì)算出具體調(diào)用方法體的內(nèi)存地址有梆,只進(jìn)行方法參數(shù)類(lèi)型和返回值類(lèi)型的校驗(yàn)是尖,在運(yùn)行時(shí)才能確定具體要調(diào)用方法體的內(nèi)存地址。Java中除了static和final方法之外泥耀,其他所有方法都是后期綁定饺汹。

4.類(lèi)型轉(zhuǎn)換:

Java中有兩種常見(jiàn)的類(lèi)型轉(zhuǎn)換:向上類(lèi)型轉(zhuǎn)換(upcast)和向下類(lèi)型轉(zhuǎn)換(downcast):

  1. 向上類(lèi)型轉(zhuǎn)換(upcast):
    向上類(lèi)型轉(zhuǎn)換是將子類(lèi)對(duì)象強(qiáng)制類(lèi)型轉(zhuǎn)換為父類(lèi)類(lèi)型,經(jīng)典用法是面向?qū)ο蟮亩鄳B(tài)特性痰催。向上類(lèi)型轉(zhuǎn)換時(shí)兜辞,子類(lèi)對(duì)象的特性將不可見(jiàn),只有子類(lèi)從父類(lèi)繼承的特性仍然保持可見(jiàn)夸溶,向上類(lèi)型轉(zhuǎn)換時(shí)編譯器會(huì)自動(dòng)檢查是否類(lèi)型兼容逸吵,通常是安全的。
  2. 向下類(lèi)型轉(zhuǎn)換:
    向下類(lèi)型轉(zhuǎn)換是將父類(lèi)類(lèi)型強(qiáng)制轉(zhuǎn)換為子類(lèi)類(lèi)型缝裁,轉(zhuǎn)換過(guò)后父類(lèi)中不可見(jiàn)的子類(lèi)特性又恢復(fù)可見(jiàn)性扫皱,向下類(lèi)型轉(zhuǎn)換時(shí),編譯器無(wú)法自動(dòng)檢測(cè)是否類(lèi)型兼容捷绑,往往會(huì)產(chǎn)生類(lèi)型轉(zhuǎn)換錯(cuò)誤的運(yùn)行時(shí)異常韩脑,通常不安全。

向上轉(zhuǎn)型時(shí)粹污,任何字段訪問(wèn)操作都是由編譯器解析段多,因此不是多態(tài)的。

5.方法重載(overloading)

方法同名壮吩,參數(shù)列表不同稱為方法重載进苍,注意方法的返回值類(lèi)型不同不能作為方法重載蕾总。

6.在組合 與 繼承 之間選擇

  1. is-a繼承:一個(gè)類(lèi)繼承具有相似功能的另一個(gè)類(lèi),根據(jù)需要在所繼承的類(lèi)基礎(chǔ)上進(jìn)行擴(kuò)展琅捏。
    優(yōu)點(diǎn):具有共同屬性和方法的類(lèi)可以將共享信息抽象到父類(lèi)中生百,增強(qiáng)代碼復(fù)用性,同時(shí)也是多態(tài)的基礎(chǔ)柄延。
    缺點(diǎn):子類(lèi)中擴(kuò)展的部分對(duì)父類(lèi)不可見(jiàn)蚀浆,另外如果共性比較少的時(shí)候使用繼承會(huì)增加冗余代碼;

  2. has-a組合:has-a組合是在一個(gè)類(lèi)中引用另一個(gè)類(lèi)作為其成員變量。
    優(yōu)點(diǎn):可擴(kuò)展性和靈活性高搜吧。在對(duì)象組合關(guān)系中應(yīng)優(yōu)先考慮has-a組合關(guān)系市俊。
    缺點(diǎn):具有共性的類(lèi)之間看不到派生關(guān)系。

組合技術(shù)通常用于想在新類(lèi)中使用現(xiàn)有類(lèi)的功能而非它的接口滤奈。

7.java即時(shí)編譯技術(shù)(JIT):

Java的JIT是just-in-time complier技術(shù)摆昧,JIT技術(shù)是java代碼部分地或全部轉(zhuǎn)換成本地機(jī)器碼程序,不再需要JVM解釋蜒程,執(zhí)行速度更快绅你。
當(dāng)一個(gè)”.class”的類(lèi)文件被找到時(shí),類(lèi)文件的字節(jié)碼被調(diào)入內(nèi)存中昭躺,這時(shí)JIT編譯器編譯字節(jié)碼代碼忌锯。
JIT有兩個(gè)不足:

  1. JIT編譯轉(zhuǎn)換需要花費(fèi)一些時(shí)間,這些時(shí)間貫穿于程序的整個(gè)生命周期领炫。
  2. JIT增加了可執(zhí)行代碼的size偶垮,相比于壓縮的字節(jié)碼,JIT代碼擴(kuò)展了代碼的size帝洪,這有可能引起內(nèi)存分頁(yè)似舵,進(jìn)而降低程序執(zhí)行速度。

對(duì)JIT不足的一種改進(jìn)技術(shù)是延遲評(píng)估(lazy evaluation):其基本原理是字節(jié)碼并不立即進(jìn)行JIT編譯除非必要葱峡,在最近的JDK中采用了一種類(lèi)似延遲JIT的HotSpot方法對(duì)每次執(zhí)行的代碼進(jìn)行優(yōu)化砚哗,代碼執(zhí)行次數(shù)越多,速度越快族沃。

8.final關(guān)鍵字

  1. 一個(gè)既是static又是final的字段只占據(jù)一段不能改變的存儲(chǔ)空間频祝。對(duì)對(duì)象的引用運(yùn)用final時(shí)泌参,該引用無(wú)法再指向另一個(gè)對(duì)象脆淹,然而對(duì)象本身是可以被修改的。
  2. 定義為final的字段必須在字段的定義處或者構(gòu)造方法中進(jìn)行賦值沽一,從而使得final字段在使用前總是被初始化盖溺。
  3. 類(lèi)中所有的private方法都隱式地指定為是final的,以防止任何繼承類(lèi)修改它的含義铣缠。
  4. final類(lèi)禁止繼承烘嘱,所以final類(lèi)中所有的方法都隱式指定是final的昆禽。
  5. 在構(gòu)造器內(nèi)唯一能夠安全調(diào)用的那些方法是基類(lèi)中的final方法,非final方法可能會(huì)使用還未初始化的字段蝇庭,而出現(xiàn)異常醉鳖。

9.抽象類(lèi)

  • 包含抽象方法的類(lèi)叫做抽象類(lèi),但抽象類(lèi)不一定含有抽象方法哮内。繼承于抽象類(lèi)的類(lèi)必須實(shí)現(xiàn)抽象基類(lèi)中的抽象方法盗棵,否則該類(lèi)也必須定義為抽象類(lèi)。
  • 抽象類(lèi)不能實(shí)例化任何對(duì)象北发。

10.接口

  • 可以繼承任意多個(gè)接口纹因,并可以向上轉(zhuǎn)型為每個(gè)接口,因?yàn)槊恳粋€(gè)接口都是一個(gè)獨(dú)立的類(lèi)型琳拨。
  • 接口彼此之間可以嵌套瞭恰。
  • 嵌套在另一個(gè)接口中的接口自動(dòng)就是public的,而不能聲明為private的狱庇。
  • 當(dāng)實(shí)現(xiàn)某個(gè)接口時(shí)惊畏,并不需要實(shí)現(xiàn)嵌套在其內(nèi)的任何接口。

11.內(nèi)部類(lèi)

  • 內(nèi)部類(lèi)可以把一些邏輯相關(guān)的類(lèi)組織在一起密任,并控制位于內(nèi)部的類(lèi)的可視性陕截。
  • 內(nèi)部類(lèi)還擁有其外圍類(lèi)的所有元素的訪問(wèn)權(quán)。構(gòu)建內(nèi)部類(lèi)對(duì)象時(shí)批什,需要一個(gè)指向其外圍類(lèi)對(duì)象的引用农曲,在擁有外部類(lèi)對(duì)象之前是不可能創(chuàng)建內(nèi)部類(lèi)對(duì)象的。
  • 在方法和作用域內(nèi)可以定義內(nèi)部類(lèi)驻债,此使用方式把類(lèi)名去掉就是匿名內(nèi)部類(lèi)乳规;由于此種內(nèi)部類(lèi)在方法或作用域外不可見(jiàn),通常向上轉(zhuǎn)型對(duì)此類(lèi)的對(duì)象進(jìn)行引用合呐。
  • 匿名內(nèi)部類(lèi)不可能有命名的構(gòu)造器暮的;匿名內(nèi)部類(lèi)既可以拓展類(lèi),也可以實(shí)現(xiàn)接口淌实,但是不能兩者兼?zhèn)涠潮纾胰绻菍?shí)現(xiàn)接口,也只能實(shí)現(xiàn)一個(gè)接口拆祈。
  • 因?yàn)閮?nèi)部類(lèi)的構(gòu)造器必須連接到指向其外圍類(lèi)對(duì)象的引用恨闪,所以在繼承內(nèi)部類(lèi)的時(shí)候,不能使用默認(rèn)的構(gòu)造器放坏,而需要傳遞一個(gè)指向外圍類(lèi)對(duì)象的引用咙咽,并且必須在構(gòu)造器內(nèi)調(diào)用outer.super();

12.嵌套類(lèi)

  • 將內(nèi)部類(lèi)聲明為static,就稱為嵌套類(lèi)淤年。嵌套類(lèi)不需要外圍類(lèi)的對(duì)象钧敞,因此不能從嵌套類(lèi)的對(duì)象中訪問(wèn)非靜態(tài)的外圍類(lèi)對(duì)象蜡豹。
  • 普通內(nèi)部類(lèi)的字段和方法,只能放在類(lèi)的外部層次上溉苛,所以普通的內(nèi)部類(lèi)不能有static數(shù)據(jù)和static字段镜廉,也不能包含嵌套類(lèi)。
  • 接口內(nèi)部的類(lèi)自動(dòng)就是嵌套類(lèi)愚战,因?yàn)榻涌趦?nèi)的任何字段方法類(lèi)都自動(dòng)地是public和static的桨吊;放置在接口內(nèi)部的類(lèi),甚至可以實(shí)現(xiàn)其外圍接口凤巨。

持續(xù)完善補(bǔ)充视乐!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市敢茁,隨后出現(xiàn)的幾起案子佑淀,更是在濱河造成了極大的恐慌,老刑警劉巖彰檬,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伸刃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡逢倍,警方通過(guò)查閱死者的電腦和手機(jī)捧颅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)较雕,“玉大人碉哑,你說(shuō)我怎么就攤上這事×两” “怎么了扣典?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)慎玖。 經(jīng)常有香客問(wèn)我贮尖,道長(zhǎng),這世上最難降的妖魔是什么趁怔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任湿硝,我火速辦了婚禮,結(jié)果婚禮上润努,老公的妹妹穿的比我還像新娘关斜。我一直安慰自己,他們只是感情好任连,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布蚤吹。 她就那樣靜靜地躺著例诀,像睡著了一般随抠。 火紅的嫁衣襯著肌膚如雪裁着。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天拱她,我揣著相機(jī)與錄音二驰,去河邊找鬼。 笑死秉沼,一個(gè)胖子當(dāng)著我的面吹牛桶雀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播唬复,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼矗积,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了敞咧?” 一聲冷哼從身側(cè)響起棘捣,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎休建,沒(méi)想到半個(gè)月后乍恐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡测砂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年茵烈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砌些。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呜投,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出存璃,到底是詐尸還是另有隱情宙彪,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布有巧,位于F島的核電站释漆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏篮迎。R本人自食惡果不足惜男图,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甜橱。 院中可真熱鬧逊笆,春花似錦、人聲如沸岂傲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)矾利。三九已至蹭沛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缩歪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓谍憔,卻偏偏與公主長(zhǎng)得像匪蝙,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子习贫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容