A. 如何學習面向對象編程
一般的,單純從面向對象編程這方面來說,我們需要先理解對象的概念,以及為什麼我們要使用面向對象編程,以及跟傳統過程化編程之間的優劣。
對象(object),即將一組數據與這組數據有關操作組裝在一起,形成一個實體,這個實體就是對象。
用通俗的話來講,一個人也可以算是一個對象,這個對象可能包含一些屬性(attribute),例如男性女性,這個對象也會有一些功能,例如讓一個人去吃飯,他能去吃飯,這就是功能(function)。
我們在編程的時候,盡可能要讓代碼看起來更有可讀性,舉例當我們去寫一款游戲,我們要創建人類這個類(class)
//以C++為例
classPerson
{
//這段代碼定義了人這個類
}
我們把人類的屬性和功能輸入進去
classPerson
{
public:
StringName{get;set;}
intAge{get;set;}
voidEat(Foodfood){/**吃點東西吧**/}
privite:
intHeight{get;set;}
}
到這時這還只是個類。當類創建完畢以後我們可以實例化這個類
Personp1;
這個實例化出來的實體p1就是一個對象,我們可以去單獨改變這單個對象的屬性數據或者是調用這個類的功能(或者說方法)
p1.Age=20;
p1.Eat();
我們還可以創建另一個人
Personp2;
p2.Age=22;
每一個對象都可以有不一樣的屬性,但是他們是屬於一類的,就好比姚明跟郭敬明雖然身高不同但都是人類一樣。
當理解了面向對象編程是為了解決何種問題以後,面向對象的編程將不是一個難題,而是一種更為豐富的編程玩法。
如果把面向對象跟面向過程比較有什麼不同呢?
面向過程注重的是每個動作
比如我們來運行一台電腦,那麼我們就得打開顯示器,讓後打開主機,當然前提是你已經插上電源,所以我們就得描述兩個過程,然後我們打開電視機,只要按個按鈕,這個動作其實和按電腦的顯示器是同一個過程,當然我們又得描述這個過程,如果我們用面向過程開發的話,我們就要把開電腦和開電視分開描述,那麼按視頻按鈕就重復了兩次
然而我們如果用面向對象思想,把按視頻按鈕提取出來,然後開主機又是一個類,繼承與按視頻按鈕,那麼我們只要一次的描述按視頻按鈕就可以同時用於開電腦和電視機,原因是我們提取了開視頻顯示器的本質,所以面向對象就是我們把一件事情按一個一個動作來描述出來,而面向對象則是提取共有性質讓後重復利用該類
B. 怎樣進行面向對象的程序設計
面向對象程序設計的基本概念:面向對象, 概括地說, 就是把問題抽象為對象, 設置屬性(數據) , 指定事件或處理方式(代碼) 來達到目的, 強調從問題域的概念到軟體程序和界面的直接映射。面向對象程序設計中的概念主要包括:對象、類、數據抽象、繼承、動態綁定、數據封裝、多態性、消息傳遞。通過這些概念面向對象的思想得到了具體的體現。
面向對象程序設計的基本特徵1)對象:對象是運行期的基本實體,它是一個封裝了數據和操作這些數據的代碼的邏輯實體。2)類:類是具有相同類型的對象的抽象。一個對象所包含的所有數據和代碼可以通過類來構造。3)封裝性:封裝是一種信息隱蔽技術,它體現於類的說明,是對象的重要特性。封裝使數據和加工該數據的方法(函數)封裝為一個整體,以實現獨立性很強的模塊,使得用戶只能見到對象的外特性(對象能接受哪些消息,具有那些處理能力),而對象的內特性(保存內部狀態的私有數據和實現加工能力的演算法)對用戶是隱蔽的。封裝的目的在於把對象的設計者和對象者的使用分開,使用者不必知曉行為實現的細節,只須用設計者提供的消息來訪問該對象。4)繼承性:繼承性是子類自動共享父類之間數據和方法的機制。它由類的派生功能體現。一個類直接繼承其它類的全部描述,同時可修改和擴充。繼承具有傳遞性。繼承分為單繼承(一個子類只有一父類)和多重繼承(一個類有多個父類)。類的對象是各自封閉的,如果沒繼承性機制,則類對象中數據、方法就會出現大量重復。繼承不僅支持系統的可重用性,而且還促進系統的可擴充性。5)多態性:對象根據所接收的消息而做出動作。同一消息為不同的對象接受時可產生完全不同的行動,這種現象稱為多態性。利用多態性用戶可發送一個通用的信息,而將所有的實現細節都留給接受消息的對象自行決定,如是,同一消息即可調用不同的方法。例如:Print消息被發送給一圖或表時調用的列印方法與將同樣的Print消息發送給一正文文件而調用的列印方法會完全不同。多態性的實現受到繼承性的支持,利用類繼承的層次關系,把具有通用功能的協議存放在類層次中盡可能高的地方,而將實現這一功能的不同方法置於較低層次,這樣,在這些低層次上生成的對象就能給通用消息以不同的響應。在OOPL中可通過在派生類中重定義基類函數(定義為重載函數或虛函數)來實現多態性。6)動態綁定
綁定指的是將一個過程調用與相應代碼鏈接起來的行為。動態綁定是指與給定的過程調用相關聯的代碼只有在運行期才可知的一種綁定,它是多態實現的具體形式。7)消息傳遞:對象之間需要相互溝通,溝通的途徑就是對象之間收發信息。消息內容包括接收消息的對象的標識,需要調用的函數的標識,以及必要的信息。消息傳遞的概念使得對現實世界的描述更容易。
面向對象語言
C. 面向對象編程方法的要點
沒有什麼要點,別瞎想。自己多寫寫,等你寫一萬行以上了,感覺自然來。看書沒用,多動手。
D. 如何正確理解面向對象編程和面向過程編程,他們之間的關系是怎樣的
面向切面的編程
主要實現的目的是針對業務處理過程中的切面進行提取,它所面對的是處理過程中的某個步驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果。
比如我們最常見的就是日誌記錄了,舉個例子,我們現在提供一個服務查詢學生信息的,但是我們希望記錄有誰進行了這個查詢。如果按照傳統的oop的實現的話,那我們實現了一個查詢學生信息的服務介面(studentinfoservice)和其實現類(studentinfoserviceimpl.java),同時為了要進行記錄的話,那我們在實現類(studentinfoserviceimpl.java)中要添加其實現記錄的過程。這樣的話,假如我們要實現的服務有多個呢?那就要在每個實現的類都添加這些記錄過程。這樣做的話就會有點繁瑣,而且每個實現類都與記錄服務日誌的行為緊耦合,違反了面向對象的規則。
那麼怎樣才能把記錄服務的行為與業務處理過程中分離出來呢?看起來好像就是查詢學生的服務自己在進行,但是背後日誌記錄對這些行為進行記錄,但是查詢學生的服務不知道存在這些記錄過程,這就是我們要討論aop的目的所在。aop的編程,好像就是把我們在某個方面的功能提出來與一批對象進行隔離,這樣與一批對象之間降低了耦合性,可以就某個功能進行編程。
E. 怎樣把面向過程編程變為面向對象編程
面向對象是一種思維方式,和面向過程有非常大的區別。如果你的代碼已經成型了,那麼只有重構才能變成面向對象。或者使用一些設計模式,如適配器模式,部分轉換成面向對象。
如果還沒有開始編碼,可以先讀一些面向對象的書籍,推薦 《面向對象之禪》 ,簡單易懂。先了解為什麼要面向對象,然後再學習一些方法,建立面向對象的思維模式。
F. 新手如何學習編程
熟悉以下關鍵東西,可以邊學邊做,定期訓練,經常思考,長期積累:
1、語法。
2、基礎理論(數學、數據結構、演算法等)。
3、設計方法(編程原則、設計模式、框架設計等)。
4、庫(核心、基礎、UI、擴展、游戲引擎等)。
5、計算機相關(操作系統、網路、圖形學等)。
6、領域知識(游戲設計、網站設計等)。
7、開發工具(編輯器、IDE、自動部署等)。
8、項目管理(進度管理、分工協作、Bug管理、版本控制等)。
最普遍也是最重要的能力:創造力。努力分析並理解好做什麼以及怎麼做。要知道上面那些東西一開始都是不存在的。
具體方法包括:
1、快速閱讀入門教程和書籍,適合學習語言和基礎庫。比如我學Java讀的《Java編程思想》,練習題做過一點,然後學ActionScript就沒讀過書,只讀過Adobe官方文檔《ActionScript 3.0編程》。
2、閱讀庫的文檔、實例、源碼。比如Flash、Flex開發,熟悉官方API很重要,很多細節要具體使用時才注意到,這時候最好做個筆記,雖然我從沒看過我的筆記。
3、做一個自己感興趣或熟悉的小項目,比如我就以黑白棋游戲作為多個語言的試水項目,一樣的邏輯,便於把關注點放在語言特點上。
4、自己動手豐衣足食。廚師有菜譜,程序員可沒菜譜。比如我做游戲,最關鍵的游戲編程知識全部是動手學出來的,很少有專門針對某個業務領域(如游戲)的編程書籍,要麼是入門書,要麼是模式書(如演算法)、理論書(圖形學),很少有書籍教你如何開發一個45度角地圖系統加編輯器的,全靠自己思考,以及看前人的代碼,需要時找些網路資料。關鍵是,可以培養最重要的創造力。
對於演算法和設計模式,可以研讀下,但是關鍵還是靠平時如何使用了。新手勉強不來的。
項目管理方面的,就得靠工作經驗了,多思考多提意見不要只走流程。