一、面向過程編程與面向對象編程
1、什么是面向過程編程?
面向過程其實是最為實際的一種思考方式,就是算面向對象的方法也是含有面向過程的思想.可以說面向過程是一種基礎的方法,它考慮的是實際的實現一般的面向過程是從上往下步步求精.對比面向過程,面向對象的方法主要是把事物給對象化,對象包括屬性與行為。當程序規模不是很大時,面向過程的方法還會體現出一種優勢,因為程序的流程很清楚,按著模塊與函數的方法可以很好的組織.比如拿做飯說這種面向過程吧.粗略的可以將過程擬為:
買菜>淘米>切菜>蒸米>炒菜>上菜
而這5步就是一步一步的完成,它的順序很重要,你只須一個一個的實現就行了.而如果是用面向對象的方法的話,可能就只抽象出一個做飯的類,它包括這四個方法,但是具體的順序就不能體現出來。
比較官方的解釋就是:“面向過程”(Procedure Oriented)是一種以過程為中心的編程思想。這些都是以什么正在發生為主要目標進行編程,不同于面向對象的是誰在受影響。C語言就是一門面向過程的語言。
2、什么是面向對象編程?
面向對象程序設計模擬自然界認識和處理事物的方法,將數據和對數據的操作方法放在一起,形成一個相對獨立的整體——對象(object)(面向對象的程序設計就是由這些對象構造程序),同類對象還可以抽象出共性,形成類(class)。一個類中的數據通常通常只能通過本類提供的方法進行處理,這些方法成為該類與外部的接口。對象之間通過消息(message)進行通訊。
比較官方的解釋就是:面向對象程序設計(Object Oriented Programming,OOP)是一種計算機編程架構。OOP的一條基本原則是計算機程序由單個能夠起到子程序作用的單元或對象組合而成。OOP達到了軟件工程的三個主要目標:重用性、靈活性和擴展性。OOP=對象+類+繼承+多態+消息,其中核心概念是類和對象。C++就是一門面向對象的語言。
二、面向對象思想的組成
1、什么是類?
類是人們對于客觀事物的高度抽象,面向對象方法中的類是一種類型,它是具有相同屬性和行為的對象的集合。類是具有相同屬性和行為的若干對象的模板。類為屬于該類的全部對象提供了抽象的描述,這種描述包括了屬性和行為兩大部分。
類就是同一類事物的總稱,比如我本身這個對象可以講話,那么基本上所有人都具備這個方法,就將我這一類的對象稱為類,類的思想就是這樣產生的。更恰當的描述:類就是世間事物的抽象稱呼,而對象就是這個事物相對應的實體,人類就是一個類,而你我就是個實例,即對象;這也是為什么人類里面有個類,動物類,植物類,都有一個類,單說一個動物類,我們只能知道是動物,卻無法確定是那種動物,而對象就是具體實例化動物。在java語言中,類中對象的行為是以方法的形式定義的,對象的屬性是以成員變量的形式定義的,而類包括對象的屬性和方法。
2、什么是對象?
現實世界中,任何事物都是對象,對象是事物存在的實體,比如人,桌子,電腦,空氣,思想。在計算機的世界中,面對對象程序設計的思想要以對象來思考問題,首先要將現實的實體抽象為對象,然后考慮這個對象所具備的屬性和行為,如我們的手機,就是一個對象,將手機抽象為對象,然后識別這個對象的屬性,對象具備的屬性都是靜態屬性,比如手機的尺寸,材質,顏色等等,接著識別這個對象的動態行為,如打電話,拍照等等。當識別出這個對象的屬性和行為后,這個對象就被定義完成了,然后可以根據再根據各種手機的特點,將這些手機共有的屬性和行為封裝起來來描述手機,由此可見,類實質上就是封裝對象屬性和行為的載體,而對象則是類抽出來的一個實例。
3、什么是封裝?
封裝是面向對象編程的核心思想。將對象的屬性和行為封裝起來,其載體就是類,類通常對用戶隱藏其實現細節,這就是封裝的思想,就比如我們使用一個庫函數時,我們只需要知道它的作用就可以了,沒必要去了解它的內部工作,比如print函數,我們只需要知道用它可以輸出我們我們想輸出的內容即可,更通俗的講,我們只需要寫完博文點擊發布就可以,而不用去管它如何上傳至互聯網,采用封裝的思想保證了類內部數據結構的完整性,使用該類的用戶不能輕易地直接操作此數據結構,只能執行類允許公開的數據,這也就避免了外部操作對內部數據的影響,提高了程序的可維護性。
4、什么是繼承?
類和類之間具有關系,比如貓類和狗類,測繪人或GISer,當處理一個問題時,我們可以將一些有用的類保留下來,在遇到同樣的問題時拿來復用,做一個不恰當的比喻,學電腦的現在要讀一篇英文文章,假設他們英語很爛,這時應該想到學英語的人,我們可以使用學英語這類人特殊的屬性,我們不看其他屬性,我們只使用會英語這門屬性,這樣就節省了學電腦的還需要學習英語來讀英語文章,這樣就大大節省了學電腦的時間,這就是繼承的基本思想,可見設計軟件的代碼時可以使用繼承思想來縮短軟件開發的時間,復用那些以前已經定義好的類,提高系統性能,減少系統在使用過程中出現錯誤的幾率,這就是為什么有些人寫完一個功能會把代碼保存起來,下次需要這個需求,我們就可以拿來代碼直接用。
在java中,人類這種大類被稱為父類,而學習電腦,學習英語這幾類人被稱為子類,他們都是父類分離出來的,他們有著必然的聯系,他們都是人。
5、什么是多態?
概念:同一類的對象收到相同消息時,會得到不同的結果。而這個消息是不可預測的。多態,顧名思義,就是多種狀態,也就是多種結果。簡單的說:就是用基類的引用指向子類的對象。
多態首先是建立在繼承的基礎上的,先有繼承才能有多態。多態是指不同的子類在繼承父類后分別都重寫覆蓋了父類的方法,即父類同一個方法,在繼承的子類中表現出不同的形式。多態成立的另一個條件是在創建子類時候必須使用父類new子類的方式。
多態性是一種通過多種狀態或階段描述相同對象的編程方式。它的真正意義在于:實際開發中,只要關心一個接口或基類的編程,而不必關心一個對象所屬于的具體類。
區別是否是多態的關鍵字在于看對象是否屬于同一類型。如果把它們看做同一種類型,調用相同的函數,返回了不同的結果,那么它就是多態,否則,不能稱為多態。
多態的含義大約等同于“同一個方法對于不同類型的輸入參數均能做出正確的處理過程,并給出人們所期望獲得的結果”,也許這正體現了人們對于多態性所能達到的效果所寄予的期望:使程序能夠做到越來越智能化,越來越易于使用,越來越能夠使設計者透過形形色色的表象看到代碼所要觸及到的問題本質。
總體是分為通用多態和專用多態:
通用多態:不同的類型值,執行相同的代碼。
專用多態:不同的類型值,執行不同的代碼。(類似枚舉 “什么類型,執行什么操作”)
通用多態分為:參數多態和包含多態
參數多態:參考c++中的template(靜態聯編時候實現)
包含多態:可以理解為abstract functions,interface的方法(動態聯編時候實現,)
專用多態:強制多態和重載多態
強制多態:可以理解為類型的隱式轉換(靜態聯編時候實現)
重載多態:參考C++中的函數重載的理解(靜態聯編時候實現)
6、什么是消息?
對象通過相互間傳遞消息來相互作用和通信,一個消息由三部分組成:
1. 接受消息的對象
2. 接收對象要采取的方法
3. 方法需要的參數
//在對象外,想要對象執行執行它的某個方法(函數),就需要向其發送一條消息。
//例子:
class A
{
public:
void fun(){}
};
int main()
{
A a;
a.fun();//這條語句就是向a對象發送的一個消息,請求它執行它的fun方法(函數)
}
對象是類的實例。盡管對象的表示在形式上與一般數據類型十分相似,但是它們之間存在一種本質區別:對象之間通過消息傳遞方式進行通信。 消息傳遞原是一種與通信有關的概念,OOP使得對象具有交互能力的主要模型就是消息傳遞模型。對象被看成用傳遞消息的方式互相聯系的通信實體,它們既可以接收可以拒絕外界發來的消息。一般情況下,對象接收它能夠識別的消息,拒絕它不能識別消息。對于一個對象而言,任何外部的代碼都不能以任何不可預知或事先不允許的方式與這個對象進行交互。
發送一條消息至少應給出一個對象的名字和要發給這個對象的那條消息的名字。經常,消息的名字就是這個對象中外界可知的某個方法的名字。在消息中,經常還有一組數(也就是那個方法所要求的參數),將外界的有關信息傳給這個對象。
對于一個類來說,它關于方法界面的定義規定了實例的消息傳遞協議,而它本身身定了消息傳遞的合法范圍。由于類是先于對象構造而成的,所以一個類為它的實例提了可以預知的交互方式。例如,假設msg是類Manager的一個實例(或對象其中包含getMessage方法),當外界要求把這個對象所代表的那位經理的級別改變為2時,就應以下面的方式向這個對象發出一條消息:
msg.getMessage("helo");
7、什么是派生?
在C++中,所謂繼承就是在一個已存在的類的基礎上建立一個新的類.已存在的類(例如馬)稱為基類(base class )或父類(father class )。新建的類(例如公馬)稱為派生類(derived class )或子類(son class )。
一個新類從已有的類那里獲得其已有特性,這種現象稱為類的繼承.通過繼承,一個新建子類從已有的父類那里獲得父類的特性。從另一角度說,從已有的類(父類)產生一個新的子類,稱為類的派生。
8、什么是超類?
被繼承的類一般稱為“超類”或“父類”,繼承的類稱為“子類”。當子類繼承超類時,不必寫出全部的實例變量和方法,只需聲明該類繼承了的已定義的超類的實例變量和方法即可。超類、子類是繼承中非常重要的概念,它們形象地描述了繼承的層次關系。繼承節省了定義新類的大量工作,可以方便地重用代碼。例如,把汽車作為父類,當創建汽車的子類轎車時,品牌、價格、最高時速等屬性會自動地被定義,調用剎車方法時會自動調用在汽車類中定義的剎車方法。但一個子類不必非要使用繼承下來的屬性和方法,一個子類可以選擇覆蓋已有的屬性和方法,或添加新的屬性和方法。由繼承產生的子類比超類具有更多的特征,因此有時很容易混淆二者的概念。通常情況下,每個子類的對象“是”它的超類的對象。一個超類可以有很多個子類,所以超類的集合通常比它的任何一個子類集合都大。例如交通工具包含飛機、汽車、自行車等,而汽車子類只是交通工具中的一個小子集。
9、什么是重載?
重載,從簡單說,就是函數或者方法有相同的名稱,但是參數列表不相同的情形,這樣的同名不同參數的函數或者方法之間,互相稱之為重載函數或者重載方法。在Java中同一個類中的2個或2個以上的方法可以有同一個名字,只要它們的參數聲明不同即可。這種情況下,該方法就被稱為重載,這個過程稱為方法重載;
重載的好處就是不用為了對不同的參數類型或參數個數,而寫多個函數,多個函數只用同一個名字,但參數表,即參數的個數或(和)數據類型必須不同;調用的時候,雖然方法名字相同,但是根據參數表可以自動調用對應的函數。我們可以發現他使用很多的方法重載,這樣我們在調用的時候,就不需要記那么多的方法名稱,而是知道了方法的功能就可以直接的給他傳遞不同的參數,編譯器會明確的知道我們調用了哪一個方法。重載比if...else要優雅,減少了大量的if...else代碼。
10、什么是重寫?
程序中類的繼承特性可以產生一個子類,子類繼承父類就擁有了父類的非私有的屬性(方法和變量),在子類中可以增加自己的屬性(方法和變量),同時也可以對父類中的方法進行擴展,以增強自己的功能,這樣就稱之為重寫,也稱為復寫或者覆蓋。
文章是由博主在網絡搜索整理以及自己思考的結果,部分優秀的解釋博主選擇了保留,若侵犯到了您的權益,請私信留言,博主會妥善修改。
浙公網安備 33010602011771號