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)避诽,這種單繼承有以下好處:
- 單繼承可以確保所有的對(duì)象擁有某種共同的特性,這樣對(duì)于JVM虛擬機(jī)對(duì)所有的類(lèi)進(jìn)行系統(tǒng)級(jí)的操作將提供方便璃谨,所有的java對(duì)象可以方便地在內(nèi)存堆棧中創(chuàng)建沙庐,傳遞參數(shù)也變的更加方便簡(jiǎn)單鲤妥。
- 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ī)制:
- 前期綁定:一般在非面向?qū)ο缶幊陶Z(yǔ)言中使用职祷,在程序編譯時(shí)即計(jì)算出具體調(diào)用方法體的內(nèi)存地址氏涩。
- 動(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):
- 向上類(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)型兼容逸吵,通常是安全的。 - 向下類(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.在組合 與 繼承 之間選擇
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ì)增加冗余代碼;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è)不足:
- JIT編譯轉(zhuǎn)換需要花費(fèi)一些時(shí)間,這些時(shí)間貫穿于程序的整個(gè)生命周期领炫。
- 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)鍵字
- 一個(gè)既是static又是final的字段只占據(jù)一段不能改變的存儲(chǔ)空間频祝。對(duì)對(duì)象的引用運(yùn)用final時(shí)泌参,該引用無(wú)法再指向另一個(gè)對(duì)象脆淹,然而對(duì)象本身是可以被修改的。
- 定義為final的字段必須在字段的定義處或者構(gòu)造方法中進(jìn)行賦值沽一,從而使得final字段在使用前總是被初始化盖溺。
- 類(lèi)中所有的private方法都隱式地指定為是final的,以防止任何繼承類(lèi)修改它的含義铣缠。
- final類(lèi)禁止繼承烘嘱,所以final類(lèi)中所有的方法都隱式指定是final的昆禽。
- 在構(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ǔ)充视乐!