面向?qū)ο缶幊蹋琌bject Oriented Progamming,OOP。
1、類和對象
面向?qū)ο缶幊痰膬蓚€重要概念:類(class)和對象(object)。類是抽象的概念,對象是具體的東西。
在面向?qū)ο缶幊痰氖澜缰校磺薪詾閷ο螅瑢ο蠖加袑傩裕〝?shù)據(jù))和行為(方法),每個對象都是獨一無二的,而且對象一定屬于某個類。
當(dāng)把擁有共同特征的對象的靜態(tài)特征(屬性)和動態(tài)特征(行為)抽取出來之后,就可以定義出類。
如汽車是一個類,它的屬性包括最大速度、剩余油量等,它的方法可以有:加油、設(shè)定行駛速度等。
具體來說,一組數(shù)據(jù)結(jié)構(gòu)和處理它們的方法的集合,稱為類(class);類是具備某項功能的抽象模型,實際應(yīng)用中,需要對類進(jìn)行實例化,即為對象(object)。
如汽車是一個類(class),具體到每輛不同車就是對象(object)。
2、面向過程和面向?qū)ο?/h1>
與面向?qū)ο缶幊滔鄬Φ氖敲嫦蜻^程編程,即把問題分解為一系列解題步驟,然后用函數(shù)實現(xiàn)這些步驟。
- 面向過程的思想:由過程、步驟、函數(shù)組成,從上到下,從大到小,逐步細(xì)化,以過程為核心;
- 面向?qū)ο蟮乃枷耄合乳_發(fā)類,再得到對象,通過對象之間的調(diào)用解決問題,以對象為中心。
比如開發(fā)一個五子棋游戲。
面向過程的設(shè)計:首先分析解題步驟:開始游戲→黑子先走→繪制畫面→判斷輸贏→輪到白子→繪制畫面→判斷輸贏→返回步驟2,直到輸出最后結(jié)果。然后用函數(shù)實現(xiàn)上面每個步驟。
面向?qū)ο蟮脑O(shè)計:整個五子棋可以設(shè)計為三個類:
- 玩家:黑白雙方,這兩方的行為是一樣的;
- 棋盤:負(fù)責(zé)繪制畫面;
- 規(guī)則:負(fù)責(zé)判定輸贏。
然后,第一類對象(玩家)接受用戶輸入,并告知第二類對象(棋盤)棋子布局的變化,棋盤對象接收到了棋子的變化,就在屏幕上面顯示出這種變化,同時第三類對象(規(guī)則)對棋局進(jìn)行判定。
可以看出,面向?qū)ο笫且怨δ軄韯澐謫栴},而不是步驟。
3、面向?qū)ο缶幊痰娜筇攸c
面向?qū)ο缶幊痰娜筇攸c:封裝性、繼承性和多態(tài)性。
- 封裝(encapsulation):就是將一個類的使用和實現(xiàn)分開,只保留有限接口與外部聯(lián)系。對于用到該類的程序員,不需關(guān)心這個類是如何實現(xiàn)的,只需知道如何使用。即通過類的封裝隱藏類的內(nèi)部實現(xiàn)細(xì)節(jié)。
- 繼承(inheritance):就是派生類(子類)自動繼承一個或多個基類(父類)的屬性和方法,并可以重寫或添加新的屬性和方法。
- 多態(tài)(polymorphism):就是調(diào)用成員函數(shù)時,會根據(jù)調(diào)用函數(shù)的對象的類型來執(zhí)行不同的函數(shù)。多態(tài)最常見的用法就是聲明基類類型的指針,利用該指針指向任意一個子類對象,可以根據(jù)子類的不同而實現(xiàn)不同的方法。通過多態(tài)實現(xiàn)基于對象類型的動態(tài)分派。
封裝可以代碼模塊化,繼承可以擴(kuò)展已存在的代碼,它們都可以實現(xiàn)代碼重用;而多態(tài)則可以實現(xiàn)接口重用。