該系列文章是在讀《Java編程思想》時(shí)的讀書筆記揭斧。
一只菜鳥俯萌,如文章中有錯(cuò)誤,還請指出买优,非常感謝妨马。
歡迎相互交流。
-- QyQiaoo
文章列表
1. 抽象過程
- 所有編程語言都提供抽象機(jī)制杀赢『娑澹可以認(rèn)為人們所能夠解決的問題的復(fù)雜性直接取決于抽象的類型和質(zhì)量。其中“類型”是指“所抽象的是什么脂崔?”
語言 | 抽象 |
---|---|
匯編語言 | 匯編語言是對底層機(jī)器的輕微抽象 |
FORTRAN / BASIC / C (“命令”式語言) | 這些語言都是對匯編語言的抽象 |
- 程序員必須建立起在機(jī)器模型(位于“解空間”內(nèi)液荸,對問題建模的地方)和實(shí)際待解決問題的模型(位于“問題空間”,這是問題存在的地方)之間的關(guān)聯(lián)脱篙;
- 在面向?qū)ο蟮姆绞街校覀儗栴}空間中的元素及其在解空間中的表示稱之為“對象”伤柄,這種思想的實(shí)質(zhì)是:程序可以通過添加新類型的對象使自身用于某個(gè)特定問題绊困;
- OOP允許根據(jù)問題來描述問題。而不是根據(jù)運(yùn)行解決方案的計(jì)算機(jī)來描述問題适刀;面向?qū)ο蟪绦蛟O(shè)計(jì)的挑戰(zhàn)之一秤朗,及時(shí)在問題空間的元素和解空間的對象之間創(chuàng)建一對一的映射;
- Booch對對象提出了一個(gè)更加簡潔的陳述:對象具有狀態(tài)笔喉、行為和標(biāo)識取视;
2. 每個(gè)對象都有一個(gè)接口
- 每個(gè)對象都只能滿足某些請求,這些請求由對象的接口(Interface)所定義常挚;
-
接口確定了對某一特定對象所發(fā)出的請求作谭,如下圖所示,類型/類名稱為Light奄毡,可以向Light對象發(fā)出的請求是:打開 它折欠、關(guān)閉它、將它調(diào)亮、將它調(diào)暗锐秦。
電燈類圖
3. 每個(gè)對象都提供服務(wù)
- 當(dāng)試圖開發(fā)或者理解一個(gè)程序設(shè)計(jì)時(shí)咪奖,最好的方法之一就是將對象想象為“服務(wù)提供者”;
將對象看作是服務(wù)提供者還有一個(gè)附帶的好處:提高對象的內(nèi)聚信性酱床,高內(nèi)聚性是軟件設(shè)計(jì)的基本質(zhì)量要求之一羊赵。
4. 被隱藏的具體實(shí)現(xiàn)
- 訪問控制存在原因:一、讓程序員無法觸及他們不該觸及的部分扇谣;二昧捷、允許類庫設(shè)計(jì)者改變類的內(nèi)部結(jié)構(gòu)而不用擔(dān)心影響使用該類的程序員;
- 訪問控制有四種揍堕,如下所示:
訪問控制字符 | |
---|---|
public | 任何人都可以用 |
private | 除類型創(chuàng)建者和類型內(nèi)部方法外的任何人都不能訪問 |
protected | 除類型創(chuàng)建者和類型的內(nèi)部方法及繼承的類外的任何人都不能訪問 |
default | 同包中的類可以訪問(包的訪問權(quán)限) |
5. 復(fù)用具體實(shí)現(xiàn)
- 最簡單的復(fù)用某個(gè)類的方式就是直接使用該類的對象料身;
- 復(fù)用也可以是將類的一個(gè)對象置于某個(gè)新類中,我們稱其為“創(chuàng)建了一個(gè)成員對象”衩茸,(使用現(xiàn)有類合成新的類稱之為組合(composition))芹血,如果是動態(tài)發(fā)生則稱之為聚合(aggregation),組合經(jīng)常被視為“has-a(擁有)”關(guān)系楞慈。如:我們常說“汽車擁有引擎”幔烛,可用如下UML圖表示:
汽車擁有引擎 - 注:組合帶來了極大的靈活性。新類的成員對象通常都被聲明為private囊蓝,使得使用新類的客戶端程序員不能訪問他們盾舌,這也可用使得你在不干擾現(xiàn)有客戶端代碼的情況下膏蚓,修改這些成員,也可以在運(yùn)行時(shí)修改這些成員對象,以實(shí)現(xiàn)動態(tài)修改程序的行為洼滚,而繼承不具備這樣的靈活性,因?yàn)榫幾g器必須通過繼承而創(chuàng)建的類事假編譯時(shí)的限制徽龟。
6. 繼承
-
通過繼承我們可以實(shí)現(xiàn)以現(xiàn)有類為基礎(chǔ)蟋软,復(fù)制它并發(fā)添加修改這個(gè)副本來創(chuàng)建新類,但當(dāng)父類發(fā)生變動時(shí)姥芥,子類也會反映出這些變動兔乞,UML類圖如下所示:
繼承 父類包含了所有子類所共有的特性。
父類和子類有著相同的基礎(chǔ)接口凉唐,所以伴隨著此接口必定有某些方法的具體實(shí)現(xiàn)庸追。有兩種方法可以使父類與子類產(chǎn)生差異:一、在子類中添加新方法台囱;二淡溯、改變現(xiàn)有父類的方法,這被稱之為覆蓋(Overridding)那個(gè)方法
若子類中沒有添加新的方法簿训,此時(shí)可以稱子類完全替代一個(gè)基類對象血筑,可以被視為純粹替代绘沉,這種關(guān)系被稱為is-a(是一個(gè))關(guān)系;若添加了新的方法可以稱為is-like-a(像是一個(gè))關(guān)系豺总。
7. 伴隨多態(tài)的可互換對象
- 在處理類型的層次結(jié)構(gòu)時(shí)车伞,經(jīng)常想把一個(gè)對象對象不當(dāng)作他所屬的特定類型來對待,而是將其作為基類的對象來對待喻喳,這使得人們可以編寫不依賴特定類型的代碼另玖。
- 在Java中采用了后期綁定的概念解決了程序直至運(yùn)行時(shí)才能確定代碼的地址的問題;為了執(zhí)行后期綁定表伦,Java使用了一小段特殊的代碼來替代絕對地址調(diào)用谦去,這段代碼使用在對象中儲存的信息來計(jì)算方法體的地址。
- 將子類看為父類的過程稱為 向上轉(zhuǎn)型(upcasting)
8. 單根繼承結(jié)構(gòu)
- 單根繼承結(jié)構(gòu)保證了所有對象都具有某些功能蹦哼,因此在系統(tǒng)中可以在每個(gè)對象上執(zhí)行某些基本的操作鳄哭,并且所有的對象都可以很容易的在對上創(chuàng)建,參數(shù)傳遞也得到了極大的簡化纲熏,并且單根集成結(jié)構(gòu)也使的垃圾回收器的實(shí)現(xiàn)變得容易很多妆丘。