1、面向?qū)ο蟪绦蛟O(shè)計簡介
面向?qū)ο笫且环N程序設(shè)計方法,或者是程序設(shè)計規(guī)范,其基本思想是使用對象、類、繼承、封裝、多態(tài)等基本概念來進(jìn)行程序設(shè)計。 面向?qū)ο笫且环N符合人們思考習(xí)慣的思想,可以將復(fù)雜的事情簡單化,將程序員從執(zhí)行者轉(zhuǎn)換成了指揮者。
面向?qū)ο蟮奶卣鳎?br>
? 封裝(encapsulation)
? 繼承(inheritance)
? 多態(tài)(polymorphism)
2.java單繼承的優(yōu)點:
相比于C++
的多繼承,java只支持類的單繼承,java中的所有類的共同基類是Object類,Object類java類樹的唯一根節(jié)點,這種單繼承有以下好處:
- 單繼承可以確保所有的對象擁有某種共同的特性,這樣對于JVM虛擬機(jī)對所有的類進(jìn)行系統(tǒng)級的操作將提供方便,所有的java對象可以方便地在內(nèi)存堆棧中創(chuàng)建,傳遞參數(shù)也變的更加方便簡單。
- java的單繼承使得實現(xiàn)垃圾回收器功能更加容易,因為可以確保JVM知道所有對象的類型信息。
3.多態(tài):
在面向?qū)ο缶幊讨校宇愔袚碛泻透割愊嗤椒ê灻姆椒ǚQ為子類方法覆蓋父類方法,當(dāng)調(diào)用子類方法的某個操作時,不必明確知道子類的具體類型,只需要將子類類型看作是父類的引用調(diào)用其操作方法,在運行時,JVM會根據(jù)引用對象的具體子類類型而調(diào)用應(yīng)該的方法,這就是多態(tài)。
多態(tài)不但能夠改善代碼的組織結(jié)構(gòu)和可讀性,還能夠創(chuàng)建可拓展性的程序。
多態(tài)的基礎(chǔ)是java面向?qū)ο缶幊痰耐斫壎C(jī)制。編程中有如下兩種綁定機(jī)制:
- 前期綁定:一般在非面向?qū)ο缶幊陶Z言中使用,在程序編譯時即計算出具體調(diào)用方法體的內(nèi)存地址。
- 動態(tài)綁定/運行時綁定:面向?qū)ο缶幊陶Z言中經(jīng)常使用,在程序編譯時無法計算出具體調(diào)用方法體的內(nèi)存地址,只進(jìn)行方法參數(shù)類型和返回值類型的校驗,在運行時才能確定具體要調(diào)用方法體的內(nèi)存地址。Java中除了static和final方法之外,其他所有方法都是后期綁定。
4.類型轉(zhuǎn)換:
Java中有兩種常見的類型轉(zhuǎn)換:向上類型轉(zhuǎn)換(upcast)和向下類型轉(zhuǎn)換(downcast):
- 向上類型轉(zhuǎn)換(upcast):
向上類型轉(zhuǎn)換是將子類對象強制類型轉(zhuǎn)換為父類類型,經(jīng)典用法是面向?qū)ο蟮亩鄳B(tài)特性。向上類型轉(zhuǎn)換時,子類對象的特性將不可見,只有子類從父類繼承的特性仍然保持可見,向上類型轉(zhuǎn)換時編譯器會自動檢查是否類型兼容,通常是安全的。 - 向下類型轉(zhuǎn)換:
向下類型轉(zhuǎn)換是將父類類型強制轉(zhuǎn)換為子類類型,轉(zhuǎn)換過后父類中不可見的子類特性又恢復(fù)可見性,向下類型轉(zhuǎn)換時,編譯器無法自動檢測是否類型兼容,往往會產(chǎn)生類型轉(zhuǎn)換錯誤的運行時異常,通常不安全。
向上轉(zhuǎn)型時,任何字段訪問操作都是由編譯器解析,因此不是多態(tài)的。
5.方法重載(overloading)
方法同名,參數(shù)列表不同稱為方法重載,注意方法的返回值類型不同不能作為方法重載。
6.在組合 與 繼承 之間選擇
is-a繼承:一個類繼承具有相似功能的另一個類,根據(jù)需要在所繼承的類基礎(chǔ)上進(jìn)行擴(kuò)展。
優(yōu)點:具有共同屬性和方法的類可以將共享信息抽象到父類中,增強代碼復(fù)用性,同時也是多態(tài)的基礎(chǔ)。
缺點:子類中擴(kuò)展的部分對父類不可見,另外如果共性比較少的時候使用繼承會增加冗余代碼;has-a組合:has-a組合是在一個類中引用另一個類作為其成員變量。
優(yōu)點:可擴(kuò)展性和靈活性高。在對象組合關(guān)系中應(yīng)優(yōu)先考慮has-a組合關(guān)系。
缺點:具有共性的類之間看不到派生關(guān)系。
組合技術(shù)通常用于想在新類中使用現(xiàn)有類的功能而非它的接口。
7.java即時編譯技術(shù)(JIT):
Java的JIT是just-in-time complier
技術(shù),JIT技術(shù)是java代碼部分地或全部轉(zhuǎn)換成本地機(jī)器碼程序,不再需要JVM解釋,執(zhí)行速度更快。
當(dāng)一個”.class”的類文件被找到時,類文件的字節(jié)碼被調(diào)入內(nèi)存中,這時JIT編譯器編譯字節(jié)碼代碼。
JIT有兩個不足:
- JIT編譯轉(zhuǎn)換需要花費一些時間,這些時間貫穿于程序的整個生命周期。
- JIT增加了可執(zhí)行代碼的size,相比于壓縮的字節(jié)碼,JIT代碼擴(kuò)展了代碼的size,這有可能引起內(nèi)存分頁,進(jìn)而降低程序執(zhí)行速度。
對JIT不足的一種改進(jìn)技術(shù)是延遲評估(lazy evaluation):其基本原理是字節(jié)碼并不立即進(jìn)行JIT編譯除非必要,在最近的JDK中采用了一種類似延遲JIT的HotSpot
方法對每次執(zhí)行的代碼進(jìn)行優(yōu)化,代碼執(zhí)行次數(shù)越多,速度越快。
8.final關(guān)鍵字
- 一個既是static又是final的字段只占據(jù)一段不能改變的存儲空間。對對象的引用運用final時,該引用無法再指向另一個對象,然而對象本身是可以被修改的。
- 定義為final的字段必須在字段的定義處或者構(gòu)造方法中進(jìn)行賦值,從而使得final字段在使用前總是被初始化。
- 類中所有的private方法都隱式地指定為是final的,以防止任何繼承類修改它的含義。
- final類禁止繼承,所以final類中所有的方法都隱式指定是final的。
- 在構(gòu)造器內(nèi)唯一能夠安全調(diào)用的那些方法是基類中的final方法,非final方法可能會使用還未初始化的字段,而出現(xiàn)異常。
9.抽象類
- 包含抽象方法的類叫做抽象類,但抽象類不一定含有抽象方法。繼承于抽象類的類必須實現(xiàn)抽象基類中的抽象方法,否則該類也必須定義為抽象類。
- 抽象類不能實例化任何對象。
10.接口
- 可以繼承任意多個接口,并可以向上轉(zhuǎn)型為每個接口,因為每一個接口都是一個獨立的類型。
- 接口彼此之間可以嵌套。
- 嵌套在另一個接口中的接口自動就是public的,而不能聲明為private的。
- 當(dāng)實現(xiàn)某個接口時,并不需要實現(xiàn)嵌套在其內(nèi)的任何接口。
11.內(nèi)部類
- 內(nèi)部類可以把一些邏輯相關(guān)的類組織在一起,并控制位于內(nèi)部的類的可視性。
- 內(nèi)部類還擁有其外圍類的所有元素的訪問權(quán)。構(gòu)建內(nèi)部類對象時,需要一個指向其外圍類對象的引用,在擁有外部類對象之前是不可能創(chuàng)建內(nèi)部類對象的。
- 在方法和作用域內(nèi)可以定義內(nèi)部類,此使用方式把類名去掉就是匿名內(nèi)部類;由于此種內(nèi)部類在方法或作用域外不可見,通常向上轉(zhuǎn)型對此類的對象進(jìn)行引用。
- 匿名內(nèi)部類不可能有命名的構(gòu)造器;匿名內(nèi)部類既可以拓展類,也可以實現(xiàn)接口,但是不能兩者兼?zhèn)洌胰绻菍崿F(xiàn)接口,也只能實現(xiàn)一個接口。
- 因為內(nèi)部類的構(gòu)造器必須連接到指向其外圍類對象的引用,所以在繼承內(nèi)部類的時候,不能使用默認(rèn)的構(gòu)造器,而需要傳遞一個指向外圍類對象的引用,并且必須在構(gòu)造器內(nèi)調(diào)用
outer.super();
12.嵌套類
- 將內(nèi)部類聲明為static,就稱為嵌套類。嵌套類不需要外圍類的對象,因此不能從嵌套類的對象中訪問非靜態(tài)的外圍類對象。
- 普通內(nèi)部類的字段和方法,只能放在類的外部層次上,所以普通的內(nèi)部類不能有static數(shù)據(jù)和static字段,也不能包含嵌套類。
- 接口內(nèi)部的類自動就是嵌套類,因為接口內(nèi)的任何字段方法類都自動地是public和static的;放置在接口內(nèi)部的類,甚至可以實現(xiàn)其外圍接口。
持續(xù)完善補充!