1. 對象導(dǎo)論
1.1 抽象過程
-
面向?qū)ο蟮恼Z言有五個特點
萬物皆為對象
程序是對象的集合,它們通過發(fā)消息來通訊
每個對象都有自己的由其他對象所構(gòu)成的存儲
每個對象都有類型
某特定類型的所有對象都能收到同樣的消息
1.2 每個對象都有一個接口
- 發(fā)送消息(產(chǎn)生請求):當(dāng)向?qū)ο蟀l(fā)送請求時,相關(guān)聯(lián)的方法就會被調(diào)用
每個對象都是定義了特性和行為的某個特定的類
1.3 每個對象都提供服務(wù)
把對象看成服務(wù)提供者,有利于形成對象的高內(nèi)聚
1.4 訪問指定詞
- 訪問指定詞
- public:任何人都能訪問
- private:僅類型的創(chuàng)建者和類型內(nèi)部方法能夠使用
- protected:除類型的創(chuàng)建者和類型內(nèi)部方法能夠使用;繼承的類也能訪問(與private的區(qū)別)
- 默認(rèn)(包訪問權(quán)限):同一個包中的能夠訪問
1.5 復(fù)用具體實現(xiàn)
- 組合:使用現(xiàn)有的類合成新的類,經(jīng)常被視為(has-a)擁有關(guān)系
- 聚合:動態(tài)發(fā)生的組合
1.6 繼承
- 定義:以現(xiàn)有類為基礎(chǔ),復(fù)制出副本,并在副本上修改和添加來創(chuàng)建新類
- 現(xiàn)有類稱為基類、源類、父類
-
副本類稱為導(dǎo)出類、繼承類、子類
通過繼承產(chǎn)生的類型具有類型等價性
- 使基類和導(dǎo)出類差異的兩個方法
- 在導(dǎo)出類添加新方法
- 在導(dǎo)出類中改變基類的方法(簡稱覆蓋)
1.6.1 繼承的分類
- 純粹替代(也稱替代原則):用一個導(dǎo)出類對象來完全替代一個基類對象
- 不完全替代:在導(dǎo)出類中擴(kuò)展接口,但基類無法訪問新添加的方法
1.7 多態(tài)
-
泛化:處理類型的層次結(jié)構(gòu)時,不把對象當(dāng)作特定類型處理,而是作為基類的對象處理
?面向?qū)ο蟪绦蛟O(shè)計的最重要妙訣:編譯器不可能產(chǎn)生傳統(tǒng)意義上的函數(shù)調(diào)用,而是采用前期綁定和后期綁定的方法
-
后期綁定:向?qū)ο蟀l(fā)送消息時,被調(diào)用的代碼直到運(yùn)行時才能確定;再運(yùn)行前,編譯器僅僅確認(rèn)調(diào)用方法的存在、被調(diào)用參數(shù)和返回值類型檢查
由于OOP中,動態(tài)綁定是默認(rèn)行為,所以程序直到運(yùn)行時才確定代碼的位置;根據(jù)消息來確定具體調(diào)用的代碼,因此是動態(tài)的
-
多態(tài):同一事物在不同場景下的多種形態(tài)
-
由于動態(tài)綁定是默認(rèn)行為,所以在運(yùn)行前無法確定調(diào)用的代碼,因此根據(jù)消息來執(zhí)行后期綁定,實現(xiàn)多態(tài)
當(dāng)draw()消息發(fā)到一個匿名Shape時,會基于該Shape的實際類型產(chǎn)生正確的行為
void doSomething(Shape shape){ shape.draw(); shape.rease(); }Circle circle = new Circle(); Triangle triangle = new Triangle(); Line line = new Line(); doSomething(circle); doSomething(triangle); doSomething(line);
-
1.8單根繼承結(jié)構(gòu)
- 單根繼承:所有類最終都繼承自單一的基類
- 優(yōu)勢
- 保證所有對象一定具備某些功能,方便執(zhí)行基本操作
- 方便垃圾回收,因為所有對象都能確定類型
1.9容器
- 實際開發(fā)中,需要選擇合適容器,原因為
- 不同容器有各自的接口和行為
- 不同容器效率不同
1.9.1參數(shù)化類型
-
范型:參數(shù)化類型,使用一對尖括號,中間包含類型信息
ArrayList<Shape> shapes = new ArrayList<Shape>(); -
向下轉(zhuǎn)型:向下轉(zhuǎn)型成為更加具體的類
- 向下轉(zhuǎn)型的行為存在風(fēng)險,會出現(xiàn)異常
1.10對象的創(chuàng)建和生命周期
- 對象的存儲
- 對象置于堆?;蜢o態(tài)存儲區(qū)域來實現(xiàn):犧牲靈活性,存儲空間分配優(yōu)先考慮
- 在堆(heap)的內(nèi)存池中動態(tài)的創(chuàng)建對象:保證靈活性,但直到運(yùn)行時才知道對象數(shù)量
- Java采用動態(tài)內(nèi)存分配方式
- 對象的生命周期
- java有垃圾回收器,因此能夠自動釋放對象占用的內(nèi)存
- C++需要手動銷毀對象,不然可能導(dǎo)致內(nèi)存泄漏
1.11異常處理:處理錯誤
異常處理提供了一種從錯誤狀態(tài)進(jìn)行可靠恢復(fù)的途徑
1.12并發(fā)編程
- 線程:彼此獨立運(yùn)行的部分
- 并發(fā):多個線程同時運(yùn)行
1.13Java與Internet
1.13.1Web
- 服務(wù)器:信息存儲池、用于分發(fā)信息的軟件以及信息和軟件所駐留的機(jī)器或機(jī)群
1.13.2客戶端編程
- 通用網(wǎng)關(guān)接口(CGI):數(shù)據(jù)表單的提交通過CGI傳遞
- 插件(plug-in):下載一段代碼,插入到瀏覽器中適當(dāng)位置,來擴(kuò)展瀏覽器功能