(這是大體框架,以后部分知識細寫)
?
1? ? 抽象過程
所有編程語言都提供抽象機制。可以認為,人們能解決的問題的復雜性直接取決于抽象的類型和質量。
類型:指的是所抽象的是什么。
匯編語言是對底層機器語言的輕微抽象;
c、BASIC等命令式語言是對匯編語言的抽象;
這些語言雖然有很大的改進,但是他們做的主要抽象仍要求在解決問題時基于計算機的結構而不是問題的結構。這就要求程序員必須建立起機器模型(計算機)和實際問題的模型(一項業務)之間的關聯。這是非常費力的,使得程序難編寫,維護代價高昂。
另一種建模方式是針對特定問題進行建模,對于要解決的特定類型的問題來說,他們是非常不錯的,但是一旦超出了特定領域,就顯得力不從心了。
面向對象的方式通過向程序員提供表示問題空間中的元素的工具而更進一步。我們把問題空間(計算機)中的元素和在解空間中的表示成為“對象”。
Alan Kay總結了第一個成功的面向對象語言的五個特性:
1)萬物皆對象(理論上講,可以抽取問題的任何概念化構件,比如貓,建筑、服務)
2)程序是對象的集合,他們通過發送消息來告知彼此要做的。
3)每個對象都有自己的由其他對象所構成的存儲(換句話說,可以通過創建包含現有對象的包來創建新類型對象)
4)每個對象都擁有自己的類型(每個對象都是某個類的實例,例如旺財是狗的實例)
5)某一特定類型的所有對象都可以接收同樣的信息
簡潔來說,對象具有狀態、行為和標識。
2? ?類和對象
?
類:類是一個模板,它描述一類對象的行為和狀態。(比如貓類狗類動物類)
對象:對象是類的一個實例,有狀態和行為。例如,一條狗是一個對象,它的狀態有:顏色、名字、品種;行為有:搖尾巴、叫、吃等。
現在讓我們深入了解什么是對象。看看周圍真實的世界,會發現身邊有很多對象,車,狗,人等等。所有這些對象都有自己的狀態和行為。拿一條狗來舉例,它的狀態有:名字、品種、顏色,行為有:叫、搖尾巴和跑。
對比現實對象和軟件對象,它們之間十分相似。軟件對象也有狀態和行為。軟件對象的狀態就是屬性,行為通過方法體現。在軟件開發中,方法操作對象內部狀態的改變,對象的相互調用也是通過方法來完成。
每種編程語言都有自己的操作內存中元素的對象,在java中,萬物都是對象。注意,我們操作的是對象的引用:可以想象成電視機和遙控器,我們操作的是遙控器。
String s;
創建了一個引用,也就是遙控,但是他現在不能操作電視。
存儲的地方有:
1)寄存器: 最快的存儲區,它位于處理器內部,人們不能直接控制,也不能在程序中感覺到寄存器的存在。
2)堆棧:位于RAM,通過堆棧指針可以從處理器獲得直接支持,靠指針移動來分配或釋放內存,這是快速有效的方法。創建程序時,java系統必須知道存儲在堆棧內的所有項的生命周期。(引用存儲在堆棧)
3)堆:一種通用的內存池,存放所有的java對象。不需要知道存儲的數據的生命周期。但是用堆進行分配和清理會比用堆棧需要更多時間。
4)常量存儲:直接放在程序法代碼內部,這樣做是安全的,因為它們永遠也不會改變,存放在ROM。
5)非RAM存儲:如果數據完全活在程序之外,它可以不受任何程序的控制。比如流對象和持久化對象。
有的對象比較小、簡單,所以存儲在堆里往往不是很好,我們把他們存在堆里就可以了,這種對象我們把他們叫做基本類型。
boolean\char\byte\short\int\long\float\double\void
3? ?提供部分服務
?
當正在開發或者試圖理解一個程序設計時,最好的方法之一就是將對象想象為一個服務的提供者。
因為程序本身一定會向用戶提供服務,它將調用其他對象的服務來實現這一目的,我們的目標就是去創建能夠提供理想的服務來解決問題的一系列對象。遇到需求請問一下自己:“如果我將問題從表象中抽取出來,什么樣的對象可以解決我的問題?”他們看起來是什么樣子?他們能夠提供哪些服務?他們需要哪些對象才能履行他們的義務?如此持續的這樣做,我們會發現“這個對象好像挺簡單”。
將對象想象為一個服務的提供者,有助于提高內聚性。
人們設計對象面臨的一個問題是:將過多的功能放到了一個對象中。在良好的面向對象設計中,每個對象都可以良好的完成一個任務,但是它并不試圖做更多的事。
4? ?隱藏
將開發人員分為類創建者和客戶端程序員是非常科學的。客戶端程序員的目標是收集各種用來實現快速應用開發的類。而類的創建者的目標是構建類,這種類只向客戶端程序員暴露必須的部分,隱藏其他的部分。被隱藏的部分通常是對象內部比較脆弱的部分,他們很容易被粗心或不知內情的客戶端程序員毀壞,所以被隱藏(保護)起來。
java用三個關鍵字設定邊界:
public 對任何人可用。
private除了創建者和對象內部方法,其他任何人都不能訪問,這就像是和客戶端程序員的一堵墻,或者說是程序的保護傘。
protected和private類似,區別是繼承的類可以訪問。
無關鍵字為包權限,可以訪問同一個包的其他類成員。
5? ?復用
一旦類被創建并測試完,他就應該被視為有用的代碼單元。代碼復用是面向對象程序設計語言所提供的最了不起的優點之一。
兩種復用方法:
1)組合:把已知類放入新的類中,新的類可以由任意數量、類型的其它類組成。就像拿零件組裝汽車。
?
注意:組合帶來了極大的靈活性。由于繼承在面向對象中如此重要,所以經常被高度強調,很多程序員因此忽視了組合,處處都繼承,有時候,這樣是不科學的,不符合常理的,會導致過分復雜的設計。在建立新類時,應優先考慮組合。
?
2)繼承:我們以現有的類為基礎,添加和修改副本來創建新類。就是繼承。經典例子就是圖形:每一個圖形都有尺寸、顏色、位置等,都可以被繪制、擦出、移動、著色等。在此基礎上,可以有圓形、正方形、三角形等。他們每一個圖形都具有圖形類的特點,并有屬于自己的特點。
?
注意:繼承是否應該只繼承基類的屬性方法,而不添加新的屬性和方法呢?
如果這樣做,就意味著新類和基類是完全相同的數據類型,因為它們具有完全相同的接口。這可以被視作純粹替代,這是一種處理繼承的理想方式。這種關系為is a的關系,比如“圓形是一個(is a)形狀”。
有時必須添加新的接口元素。這樣其實并不完美,因為基類無法訪問新的方法。這種情況是is like a(像是),比如空調,房子具備了讓你控制冷氣的接口和制冷空調,后來你用了能制冷制熱的新設備替換了空調,但是房子的設計就是只涉及==設計了制冷接口,所以盡管新對象接口擴展了,但是現有系統對新街口一無所知。
6? ?多態
?
多態:同一操作作用于不同的對象,可以有不同的解釋,產生不同的執行結果。
比如你是一個酒神,對酒情有獨鐘。某日回家發現桌上有幾個杯子里面都裝了白酒,從外面看我們是不可能知道這是些什么酒,只有喝了之后才能夠猜出來是何種酒。你一喝,這是劍南春、再喝這是五糧液、再喝這是酒鬼酒….在這里我們可以描述成如下:
????? 酒 a = 劍南春
????? 酒 b = 五糧液
????? 酒 c = 酒鬼酒
????? …
????? 這里所表現的的就是多態。劍南春、五糧液、酒鬼酒都是酒的子類,我們只是通過酒這一個父類就能夠引用不同的子類,這就是多態——我們只有在運行的時候才會知道引用變量所指向的具體實例對象。
?
注意:我們或許都寫過這樣的方法:它接收一個基類參數,比如酒,然后不管這個酒是哪種酒,都能執行對應的方法。
這些代碼不是:“如果是劍南春,就這樣做,是五糧液,就那樣做。。。。。。”
而是:“你是酒,我知道你是酒,我知道你可以做一些事,那么,就去做吧”
7? ?單根繼承
?
在面向對象編程中,有一個很矚目的問題:是否所有類最終都繼承自單一的類。
在java中,答案是:是的。
而c++則不是。
具體利弊以后會解釋
8? ?容器
如果不知道在解決問題時需要多少對象,或者存活多久,那就不可能知道怎么存儲他們了。
容器(也稱為集合)在任何需要的時候都可以擴充自己以容納所有的東西。
好的OOP語言都有屬于自己的容器,比如c++的STL,Object Pascal的VCL,java也一樣有大量容器,有list、set、map等。
?
9? ?生命期
?
10? ?錯誤
?
11? ?并發
?
?
?
?