面向?qū)ο缶幊蹋琌bject Oriented Progamming,OOP。
1、類(lèi)和對(duì)象
面向?qū)ο缶幊痰膬蓚€(gè)重要概念:類(lèi)(class)和對(duì)象(object)。類(lèi)是抽象的概念,對(duì)象是具體的東西。
在面向?qū)ο缶幊痰氖澜缰校磺薪詾閷?duì)象,對(duì)象都有屬性(數(shù)據(jù))和行為(方法),每個(gè)對(duì)象都是獨(dú)一無(wú)二的,而且對(duì)象一定屬于某個(gè)類(lèi)。
當(dāng)把擁有共同特征的對(duì)象的靜態(tài)特征(屬性)和動(dòng)態(tài)特征(行為)抽取出來(lái)之后,就可以定義出類(lèi)。
如汽車(chē)是一個(gè)類(lèi),它的屬性包括最大速度、剩余油量等,它的方法可以有:加油、設(shè)定行駛速度等。

具體來(lái)說(shuō),一組數(shù)據(jù)結(jié)構(gòu)和處理它們的方法的集合,稱(chēng)為類(lèi)(class);類(lèi)是具備某項(xiàng)功能的抽象模型,實(shí)際應(yīng)用中,需要對(duì)類(lèi)進(jìn)行實(shí)例化,即為對(duì)象(object)。
如汽車(chē)是一個(gè)類(lèi)(class),具體到每輛不同車(chē)就是對(duì)象(object)。

2、面向過(guò)程和面向?qū)ο?/h1>
與面向?qū)ο缶幊滔鄬?duì)的是面向過(guò)程編程,即把問(wèn)題分解為一系列解題步驟,然后用函數(shù)實(shí)現(xiàn)這些步驟。
- 面向過(guò)程的思想:由過(guò)程、步驟、函數(shù)組成,從上到下,從大到小,逐步細(xì)化,以過(guò)程為核心;
- 面向?qū)ο蟮乃枷耄合乳_(kāi)發(fā)類(lèi),再得到對(duì)象,通過(guò)對(duì)象之間的調(diào)用解決問(wèn)題,以對(duì)象為中心。

比如開(kāi)發(fā)一個(gè)五子棋游戲。
面向過(guò)程的設(shè)計(jì):首先分析解題步驟:開(kāi)始游戲→黑子先走→繪制畫(huà)面→判斷輸贏→輪到白子→繪制畫(huà)面→判斷輸贏→返回步驟2,直到輸出最后結(jié)果。然后用函數(shù)實(shí)現(xiàn)上面每個(gè)步驟。
面向?qū)ο蟮脑O(shè)計(jì):整個(gè)五子棋可以設(shè)計(jì)為三個(gè)類(lèi):
- 玩家:黑白雙方,這兩方的行為是一樣的;
- 棋盤(pán):負(fù)責(zé)繪制畫(huà)面;
- 規(guī)則:負(fù)責(zé)判定輸贏。
然后,第一類(lèi)對(duì)象(玩家)接受用戶(hù)輸入,并告知第二類(lèi)對(duì)象(棋盤(pán))棋子布局的變化,棋盤(pán)對(duì)象接收到了棋子的變化,就在屏幕上面顯示出這種變化,同時(shí)第三類(lèi)對(duì)象(規(guī)則)對(duì)棋局進(jìn)行判定。
可以看出,面向?qū)ο笫且怨δ軄?lái)劃分問(wèn)題,而不是步驟。

3、面向?qū)ο缶幊痰娜筇攸c(diǎn)
面向?qū)ο缶幊痰娜筇攸c(diǎn):封裝性、繼承性和多態(tài)性。
- 封裝(encapsulation):就是將一個(gè)類(lèi)的使用和實(shí)現(xiàn)分開(kāi),只保留有限接口與外部聯(lián)系。對(duì)于用到該類(lèi)的程序員,不需關(guān)心這個(gè)類(lèi)是如何實(shí)現(xiàn)的,只需知道如何使用。即通過(guò)類(lèi)的封裝隱藏類(lèi)的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。
- 繼承(inheritance):就是派生類(lèi)(子類(lèi))自動(dòng)繼承一個(gè)或多個(gè)基類(lèi)(父類(lèi))的屬性和方法,并可以重寫(xiě)或添加新的屬性和方法。
- 多態(tài)(polymorphism):就是調(diào)用成員函數(shù)時(shí),會(huì)根據(jù)調(diào)用函數(shù)的對(duì)象的類(lèi)型來(lái)執(zhí)行不同的函數(shù)。多態(tài)最常見(jiàn)的用法就是聲明基類(lèi)類(lèi)型的指針,利用該指針指向任意一個(gè)子類(lèi)對(duì)象,可以根據(jù)子類(lèi)的不同而實(shí)現(xiàn)不同的方法。通過(guò)多態(tài)實(shí)現(xiàn)基于對(duì)象類(lèi)型的動(dòng)態(tài)分派。
封裝可以代碼模塊化,繼承可以擴(kuò)展已存在的代碼,它們都可以實(shí)現(xiàn)代碼重用;而多態(tài)則可以實(shí)現(xiàn)接口重用。
