抽象入門
對管理人員,它實現(xiàn)了更快和更廉價的開發(fā)與維護(hù)過程**
? 對分析與設(shè)計人員忆谓,建模處理變得更加簡單盟迟,能生成清晰秋泳、易于維護(hù)的設(shè)計方案
對程序員,對象模型顯得如此高 雅和淺顯
如果說它有缺點攒菠,那就是掌握它需付出的代價迫皱。思考對象的時候,需要采用形象思維要尔,而不是程序化的思 維
1.1 抽象的進(jìn)步
? 每個對象都類似一臺小計算機(jī)舍杜; 它們有自己的狀態(tài),而且可要求它們進(jìn)行特定的操作赵辕。與現(xiàn)實世界的“對象”或者“物體”相比既绩,編程“對 象”與它們也存在共通的地方:它們都有自己的特征和行為。
? (1) 所有東西都是對象还惠∷俏眨可將對象想象成一種新型變量;它保存著數(shù)據(jù)蚕键,但可要求它對自身進(jìn)行操作救欧。理論 上講,可從要解決的問題身上提出所有概念性的組件锣光,然后在程序中將其表達(dá)為一個對象笆怠。(2) 程序是一大堆對象的組合;通過消息傳遞誊爹,各對象知道自己該做些什么蹬刷。為了向?qū)ο蟀l(fā)出請求,需向那
個對象“發(fā)送一條消息”频丘。更具體地講办成,可將消息想象為一個調(diào)用請求,它調(diào)用的是從屬于目標(biāo)對象的一個 子例程或函數(shù)搂漠。
(3) 每個對象都有自己的存儲空間迂卢,可容納其他對象。或者說而克,通過封裝現(xiàn)有對象靶壮,可制作出新型對象。所 以拍摇,盡管對象的概念非常簡單亮钦,但在程序中卻可達(dá)到任意高的復(fù)雜程度。(4) 每個對象都有一種類型充活。根據(jù)語法,每個對象都是某個“類”的一個“實例”蜡娶。其中混卵,“類”(Class)是“類型”(Type)的同義詞。一個類最重要的特征就是“能將什么消息發(fā)給它窖张?”幕随。(5) 同一類所有對象都能接收相同的消息。這實際是別有含義的一種說法宿接,大家不久便能理解赘淮。由于類型為 “圓”(Circle)的一個對象也屬于類型為“形狀”(Shape)的一個對象,所以一個圓完全能接收形狀消 息睦霎。這意味著可讓程序代碼統(tǒng)一指揮“形狀”梢卸,令其自動控制所有符合“形狀”描述的對象,其中自然包括“圓”副女。這一特性稱為對象的“可替換性”蛤高,是 OOP 最重要的概念之一
1.2 對象的接口
所有對象——盡管各有特色——都屬于某一系列對象的一部分,這些對象具有通用的特征和行為
當(dāng)您看到“type”這個字的時候碑幅,請同時想到 “class”戴陡;反之亦然。 建好一個類后沟涨,可根據(jù)情況生成許多對象恤批。隨后,可將那些對象作為要解決問題中存在的元素進(jìn)行處理
如何利用對象完成真正有用的工作呢裹赴?必須有一種辦法能向?qū)ο蟀l(fā)出請求喜庞,令其做一些實際的事情,比如完 成一次交易篮昧、在屏幕上畫一些東西或者打開一個開關(guān)等等赋荆。每個對象僅能接受特定的請求。我們向?qū)ο蟀l(fā)出 的請求是通過它的“接口”(Interface)定義的懊昨,對象的“類型”或“類”則規(guī)定了它的接口形式窄潭。“類 型”與“接口”的等價或?qū)?yīng)關(guān)系是面向?qū)ο蟪绦蛟O(shè)計的基礎(chǔ)
1.3 實現(xiàn)方案的隱藏
Java 采用三個顯式(明確)關(guān)鍵字以及一個隱式(暗示)關(guān)鍵字來設(shè)置類邊界:public,private嫉你, protected 以及暗示性的 friendly
1.4 方案的重復(fù)使用
為重復(fù)使用一個類月帝,最簡單的辦法是僅直接使用那個類的對象。但同時也能將那個類的一個對象置入一個新 類幽污。我們把這叫作“創(chuàng)建一個成員對象”嚷辅。新類可由任意數(shù)量和類型的其他對象構(gòu)成
1.5 繼承:重新使用接口
1.5.1 改善基礎(chǔ)類.
1.5.2 等價與類似關(guān)系..
繼承只能改善原基礎(chǔ)類的函數(shù)嗎?若答案是肯定的距误,則衍生類型就是 與基礎(chǔ)類完全相同的類型簸搞,因為都擁有完全相同的接口
1.6 多形對象的互換使用
將衍生類的對象當(dāng)作基礎(chǔ)類的一個對象對待。這一點是 非常重要的准潭,因為它意味著我們只需編寫單一的代碼趁俊,令其忽略類型的特定細(xì)節(jié),只與基礎(chǔ)類打交道刑然。這樣 一來寺擂,那些代碼就可與類型信息分開。所以更易編寫泼掠,也更易理解怔软。此外,若通過繼承增添了一種新類型择镇, 如“三角形”挡逼,那么我們?yōu)椤皫缀涡螤睢毙骂愋途帉懙拇a會象在舊類型里一樣良好地工作。所以說程序具 備了“擴(kuò)展能力”沐鼠,具有“擴(kuò)展性”挚瘟。
我們將這種把衍生類型當(dāng)作它的基本類型處理的過程叫作“Upcasting”(上溯造型)
1.6.1 動態(tài)綁定....
將一條消息發(fā)給對象時,如果并不知道對方的具體類型是什么饲梭,但采取的行動同樣是正確的乘盖,這種情況就叫 作“多形性”(Polymorphism)。
對面向?qū)ο蟮某绦蛟O(shè)計語言來說憔涉,它們用以實現(xiàn)多形性的方法叫作“動態(tài) 綁定”
1.6.2 抽象的基礎(chǔ)類和接口.
設(shè)計程序時订框,我們經(jīng)常都希望基礎(chǔ)類只為自己的衍生類提供一個接口。也就是說兜叨,我們不想其他任何人實際 創(chuàng)建基礎(chǔ)類的一個對象穿扳,只對上溯造型成它,以便使用它們的接口国旷。為達(dá)到這個目的矛物,需要把那個類變成
“抽象”的——使用 abstract 關(guān)鍵字
1.7 對象的創(chuàng)建和存在時間
Java 確實提供了一個垃圾收集器
1.7.1 集合與繼承器
用于 解決特定問題的新型對象容納了指向其他對象的句柄。當(dāng)然跪但,也可以用數(shù)組來做同樣的事情履羞,那是大多數(shù)語 言都具有的一種功能。但不能只看到這一點。這種新對象通常叫作“集合”(亦叫作一個“容器”
Java 也用自己的標(biāo)準(zhǔn)庫提供了集合
集合都提供了相應(yīng)的讀寫功能
將某樣?xùn)|西置入集合時忆首,采用的方式是十分明顯的爱榔。有一個叫作“推”(Push)、“添加”(Add)
如果想對集合中的 一系列元素進(jìn)行操縱或比較糙及,而不是僅僅面向一個详幽,這時又該怎么辦呢?辦法就是使用一個“繼續(xù)器”(Iterator)浸锨,它屬于一種對象唇聘,負(fù)責(zé)選擇集合內(nèi)的元素,并把它們提供給繼承器的用戶
通過繼承器的作用柱搜,集合被抽象成一個簡單的序列雳灾。繼承器允許我們遍歷那個序列,同時毋需關(guān) 心基礎(chǔ)結(jié)構(gòu)是什么——換言之冯凹,不管它是一個矢量、一個鏈接列表炒嘲、一個堆棧宇姚,還是其他什么東西。這樣一 來夫凸,我們就可以靈活地改變基礎(chǔ)數(shù)據(jù)
1.7.2 單根結(jié)構(gòu).1.7.3 集合庫與方便使用集合1.7.4 清除時的困境:由誰負(fù)責(zé)清除浑劳?1.8 違例控制:解決錯誤 1.9 多線程.1.10 永久性 1.11 Java 和因特網(wǎng).1.11.1 什么是 Web ?1.11.2 客戶端編程(注釋⑧) 1.11.3 服務(wù)器端編程 1.11.4 一個獨立的領(lǐng)域:應(yīng)用程序.1.12 分析和設(shè)計.1.12.1 不要迷失1.12.2 階段 0:擬出一個計劃1.12.3 階段 1:要制作什么夭拌?1.12.4 階段 2:如何構(gòu)建魔熏? .1.12.5 階段 3:開始創(chuàng)建 .1.12.6 階段 4:校訂 1.12.7 計劃的回報 1.13 Java 還是 C++?