OOP:Object-oriented Programming,面向?qū)ο蟪绦蛟O(shè)計谒出。
1.1 抽象過程
- 萬物皆對象。理論上講,你可以抽取待求解問題的任何概念化構(gòu)件笤喳,將其表示為程序中的對象
- 程序是對象的集合为居,它們通過發(fā)送消息(即調(diào)用)來告知彼此所要做的。
- 每個對象都有自己的由其他對象所構(gòu)成的存儲杀狡。理解為:可以通過創(chuàng)建包含有現(xiàn)有對象的包的方式來創(chuàng)建新類型的對象蒙畴。
- 每個對象都擁有其類型。理解為:這里的類型為java代碼中的class呜象,即每個對象都是某個類(class)的一個實例膳凝。
- 某一特定類型的所有對象都可以接受同樣的消息。即繼承恭陡。
Booch對對象提出了一個更加簡潔的描述:對象具有狀態(tài)(每個對象都可以擁有內(nèi)部數(shù)據(jù)蹬音,它們給出了該對象的狀態(tài))、行為(方法)和標(biāo)識(每個對象在內(nèi)存中都有一個唯一的地址)子姜。
1.2 每個對象都有一個接口
在程序執(zhí)行期間具有不同的狀態(tài)而其他方面都相似的對象會被分組到對象的類中祟绊,這就是關(guān)鍵字class的由來楼入。
因為類描述了具有相同特性(數(shù)據(jù)元素)和行為(功能)的對象集合哥捕,所以一個類實際上就時一個數(shù)據(jù)類型。
每個對象都只能滿足某些請求嘉熊,這些請求由對象的接口(interface)所定義遥赚,決定接口的便是類型。即接口確定了對某一特定對象所能發(fā)出的請求阐肤。例如:
Light it = new Light()凫佛;
it.on()
Light:類型、類
it:特定的Light對象
new Light():創(chuàng)建該類型的新對象
it.on():發(fā)送消息請求
1.3 每個對象都提供服務(wù)
將對象想象為“服務(wù)提供者”的好處:
- 有助于開發(fā)或者理解一個程序設(shè)計
- 有居于提高對象的內(nèi)聚性孕惜。在良好的面向?qū)ο笤O(shè)計中愧薛,每個對象都可以很好地完成一項任務(wù),但是它不試圖做更多的事情衫画。
1.4 被隱藏的具體實現(xiàn)
訪問控制的原因:
- 讓客戶端程序員無法觸及他們不應(yīng)該觸及的部分毫炉;
- 允許庫設(shè)計者可以改變類內(nèi)部的工作方式而不用擔(dān)心會影響到客戶端程序員
訪問控制關(guān)鍵字:
- Public:任何人都可以用;
- Private:除類型創(chuàng)建者和類型的內(nèi)部方法之外的任何人都不能訪問削罩;
- Protected:與private作用相當(dāng)瞄勾,差別僅在于繼承的類可以訪問protected的成員,但不能訪問private的成員弥激;
- 包訪問權(quán)限:一種默認(rèn)的訪問權(quán)限进陡,當(dāng)沒有使用前面三種任何訪問指定詞時,它將發(fā)揮作用微服。這種權(quán)限下趾疚,類可以訪問在同一個包中的其他類的成員,但是在包之外,這些成員如同指定了private一樣糙麦。
1.5 復(fù)用具體實現(xiàn)
新的類可以由任意數(shù)量戈二、任意類型的其他對象以任意可以實現(xiàn)新的類中想要的功能的方式所組成。使用現(xiàn)有的類合成新的類喳资,這種概念被稱為組合(composition)觉吭,如果組合是動態(tài)發(fā)生的,那么它通常被稱為聚合(aggregation)仆邓。組合經(jīng)常被視為has-a(擁有)關(guān)系鲜滩。
組合帶來了極大的靈活性。新類的成員對象通常被聲明為private节值。
組合可以在運行時修改這些成員對象徙硅,以實現(xiàn)動態(tài)修改程序的行為。而繼承不具備這樣的靈活性搞疗,因為編譯器必須對通過繼承而創(chuàng)建的類施加編譯時的限制嗓蘑。
1.6 繼承
類型不僅僅只是描述了作用于一個對象集合上的約束條件,同時還有與其他類型之間的關(guān)系匿乃。
當(dāng)繼承現(xiàn)有類型時桩皿,也就創(chuàng)造了新的類型。這個新的類型不僅包括現(xiàn)有類型的所有成員幢炸,而且更重要的是它復(fù)制了基類的接口泄隔。也就是說,所有發(fā)送給基類對象的消息同時也可以發(fā)送給導(dǎo)出類對象宛徊。這也就意味著導(dǎo)出類與基類具有相同的類型佛嬉。
有兩種方法可以使基類和導(dǎo)出類產(chǎn)生差異:
- 在導(dǎo)出類中添加新方法(is-like-a);
- 改變現(xiàn)有基類的方法闸天,即覆蓋(overriding)基類中的方法(is-a)
1.7 伴隨多態(tài)的可互換對象
在處理類型的層次結(jié)構(gòu)時暖呕,經(jīng)常想把一個對象不當(dāng)做它所屬的特定類型來對象,而是將其當(dāng)做其基類的對象來對待(泛化)苞氮。在試圖將到處類型的對象當(dāng)作其泛化基類型對象來看待時(把圓形看作是幾何形)湾揽,存在一個問題:編譯器是不可能知道應(yīng)該執(zhí)行哪一段代碼的。JAVA是如何解決這個問題的呢葱淳?
一個非面向?qū)ο缶幊痰木幾g器產(chǎn)生的函數(shù)調(diào)用會引起所謂的前期綁定钝腺。這么做意味著編譯器將產(chǎn)生對一個具體函數(shù)名字的調(diào)用,而運行時將這個調(diào)用解析到將要被執(zhí)行的代碼的絕對地址赞厕。然而在OOP中艳狐,程序直到運行時才能確定代碼的地址,所以當(dāng)消息放松到一個泛化對象時皿桑,必須采用其他的機(jī)制毫目。
為了解決這個問題蔬啡,面向?qū)ο蟪绦蛟O(shè)計語言使用了后期綁定的概念。當(dāng)向?qū)ο蟀l(fā)送消息時镀虐,被調(diào)用的代碼直到運行時才能確定箱蟆。編譯器確保被調(diào)用方法的存在,并對調(diào)用參數(shù)和返回值執(zhí)行類型檢查(無法提供此類保證的語言被稱為是弱類型的)刮便,但是并不知道將要被執(zhí)行的確切代碼空猜。
為了執(zhí)行后期綁定,Java使用了一小段特殊的代碼來替代絕對地址調(diào)用恨旱。這段代碼使用在對象中存儲的信息來技術(shù)方法體的地址(參考第八章)辈毯。這樣,根據(jù)這一小段代碼的內(nèi)容搜贤,每一個對象都可以具有不同的行為表現(xiàn)谆沃。當(dāng)向一個對象發(fā)送消息時,該對象就能夠知道對這條消息應(yīng)該做些什么了仪芒。
在某些語言中唁影,必須明確地聲明希望某個方法具備后期綁定屬性所帶來的靈活性(C++使用virtual關(guān)鍵字來實現(xiàn))。在這些語言中掂名,方法在默認(rèn)情況下不是動態(tài)綁定的据沈。而在Java中,動態(tài)綁定是默認(rèn)行為铆隘,不需要添加額外的關(guān)鍵字來實現(xiàn)多態(tài)卓舵。
筆記:多態(tài)有兩種實現(xiàn)方式南用,一種是使用繼承重寫(overriding),另一種是重載(overloading)膀钠。
1.8 單根繼承結(jié)構(gòu)
在Java中,所有的類最終都繼承自單一的基類:Object裹虫。
在單根繼承結(jié)構(gòu)中的所有對象都具有一個共用接口肿嘲,所以它們歸根到底都是相同的基本類型。這樣保證了所有對象都具備某些功能筑公。
1.9 容器
容器:用來存儲容納相同類型對象的構(gòu)件雳窟。比如在java中,具有滿足不同需要的各種類型的容器匣屡,如List封救、Map、Set捣作、堆誉结、棧、樹等等券躁。
從設(shè)計的觀點來看惩坑,java是單根繼承結(jié)構(gòu)掉盅,只需要一個Object容器就可以了,為什么要設(shè)計不同類型的序列呢以舒?原因有兩個:
- 不同容器提供了不同類型的接口和外部行為趾痘。
- 不同的容器對于某些操作具有不同的效率。比如ArrayList(查詢數(shù)據(jù)效率高)和LinkedList(插入數(shù)據(jù)效率高)蔓钟。
1.9.1 參數(shù)化類型
Java SE5出現(xiàn)之前永票,容器存儲的對象都只具有Java中的通用類型:Object。這使得容器容易被復(fù)用滥沫,但同時也帶來了問題瓦侮,存儲時的向上轉(zhuǎn)型(丟失其身份,盡管是安全的)和取回時的向下轉(zhuǎn)型(運行時異常佣谐,不安全)肚吏,且向下轉(zhuǎn)型和運行時的檢查需要額外的程序運行時間,也需要程序員付出更多的心血狭魂。
為了解決這個問題罚攀,Jave SE5引入了參數(shù)化類型機(jī)制。參數(shù)化類型就是一個編譯器可以自動定制作用于特定類型上的類雌澄,也被稱為范型斋泄。一對尖括號,中間包含類型信息镐牺。比如:
ArrayList<Shape> shapes =new ArrayList<String>();
1.10 對象的創(chuàng)建和生命期
對象的創(chuàng)建有兩種方式:
- 為了追求最大的執(zhí)行速度炫掐,犧牲其靈活性,即對象的存儲空間和生命周期在編程時確定睬涧,這可以通過將對象置于堆棧(它們有時被稱為自動變量(automatic variable)或限域變量(scoped variable))的靜態(tài)存儲區(qū)域內(nèi)來實現(xiàn)募胃。如C++。
- 在被稱為堆(heap)的內(nèi)存池中動態(tài)的創(chuàng)建對象畦浓。在這種方式中痹束,知道運行時才知道需要多少對象,它們的生命周期如何讶请,以及它們的具體類型時什么祷嘶。因為存儲空間是在運行時被動態(tài)管理的,所以需要大量的時間在堆中分配存儲空間夺溢,這可能要遠(yuǎn)遠(yuǎn)大于在堆棧中創(chuàng)建存儲空間的時間论巍。如Java。
關(guān)于生命周期风响,對于運行在堆棧上創(chuàng)建對象的語言嘉汰,編譯器可以確定對象的存活時間,并可以自動銷毀钞诡。然而郑现,如果是在堆上創(chuàng)建對象湃崩,編譯器就會對它的生命周期一無所知。Java提供了被稱為“垃圾回收器”的機(jī)制接箫,它可以自動發(fā)現(xiàn)對象何時不再被使用攒读,并繼而銷毀它。
1.11 異常處理:處理錯誤
異常處理將錯誤處理直接置于編程語言中辛友,有時甚至置于操作系統(tǒng)中薄扁。異常是一種對象,它從出錯被“拋出”废累,并被專門設(shè)計用來處理特定類型錯誤的相應(yīng)的異常處理器“捕獲”邓梅。異常提供了一種從錯誤狀況進(jìn)行可靠性恢復(fù)的途徑。
在Java中邑滨,一開始就內(nèi)置了異常處理日缨,而且強(qiáng)制你必須使用它。它是唯一可接受的錯誤報告方式掖看。如果沒有編寫正確的處理異常的代碼匣距,那就就會得到一條編譯時的出錯消息。
1.12 并發(fā)編程
把問題切分成多個可獨立運行的部分(任務(wù))哎壳,從而提高程序的響應(yīng)能力毅待。在程序中,這些彼此獨立運行的部分稱之為線程归榕。
通常尸红,線程只是一種為單一處理器分配執(zhí)行時間的手段。但是如果操作系統(tǒng)支持多處理器刹泄,那么每個任務(wù)都可以被指派給不同的處理器外里,實現(xiàn)真正的并行,從而提高處理速度循签。
1.13 Java與Internet
1.13.1 Web是什么
1. 客戶端/服務(wù)器計算技術(shù)
服務(wù)器:信息存儲池级乐、用于分發(fā)信息的軟件以及信息與軟件所駐留的機(jī)器或機(jī)器群被總稱為服務(wù)器。
客戶機(jī):駐留在用戶機(jī)器上的軟件與服務(wù)器進(jìn)行通信县匠,以獲取信息、處理信息撒轮,然后將它們顯示在客戶機(jī)的用戶機(jī)器上乞旦。
2.Web是一臺巨型服務(wù)器
Web實際上就是一個巨型客戶/服務(wù)器系統(tǒng),但稍微差一點题山,因為所有的服務(wù)器和客戶機(jī)都同時共存于一個網(wǎng)絡(luò)中兰粉。
1.13.2 客戶端編程
1. 插件
定義:下載一段代碼,并將其插入到瀏覽器中適當(dāng)?shù)奈恢枚ネ源藖頌闉g覽器添加新功能玖姑。
缺點:編寫插件不是件輕松的事愕秫,也不是構(gòu)建某特定網(wǎng)站的過程中所要做的事情。
價值:它允許專家級的程序員不需要經(jīng)過瀏覽器生產(chǎn)廠商的許可焰络,就可以開發(fā)某種語言擴(kuò)展戴甩,并將它們添加到服務(wù)器中
2. 腳本語言
定義:使用某種腳本語言,可以將客戶端程序的源代碼直接嵌入到HTML頁面中闪彼,解釋這種語言的插件在HTML頁面被顯示時自動激活甜孤。
缺點:代碼會暴露給任何人去瀏覽(竊取)畏腕。
優(yōu)點:腳本語言易于理解缴川。
3.Java
定義:通過applet以及使用Java Web Start來進(jìn)行客戶端編程的。
優(yōu)點:Java是一種功能強(qiáng)大描馅、安全的把夸、跨平臺的、國際化的編程語言铭污,而且還在不斷的被擴(kuò)展扎即,以提供更多的語言功能和類庫。
缺點:安裝Java運行時環(huán)境(JRE)所必需的10MB帶寬對于一般的用戶來說過于恐怖了况凉。
4. 備選方案:Macromedia的Felx
5. .NET和C#
挑戰(zhàn):跨平臺
6. Internet與Intranet
Intranet: 當(dāng)Web技術(shù)僅限用于特定公司的信息網(wǎng)絡(luò)時谚鄙,它就被稱為Intranet(企業(yè)內(nèi)部網(wǎng))。在安裝升級程序時所浪費的時間是遷移到瀏覽器方式上的最主要的原因刁绒。