天天看點

【Java程式設計思想讀書筆記】第一章:對象導論

參考書目:《Java程式設計思想》(第四版)

友鍊:​​【讀書筆記】Java重要知識點整理與彙總​​

閱讀《Java程式設計思想》(第四版)一書收獲頗多,之是以想通過用部落格記筆記的方式來讀書,是因為這樣可以倒逼自己仔細、反複地閱讀書中的知識,找相對意義上的重點,并且由于人腦更适合輸出型的學習,通過将内容邊看、邊記、邊了解和邊打字寫文,相比直接反複閱讀更有效益(當然這本書後續仍需反複閱讀幾十遍甚至百遍以上都不為過),而另一個原因就是這樣也能夠在閱讀中通過部落格來記錄自己的學習曆程,部落格記錄的不隻是圖文,它們記錄的正是自己的成長,等以後畢業或者工作後,回首大學四年,多少有點可以回念的東西,還可以說一句:一路走來,我讀了很多前輩們的好書,對技術充滿了熱情,永遠在不斷學習的路上。

start.作者講授思路:

【Java程式設計思想讀書筆記】第一章:對象導論

1.面向對象程式設計(Object-oriented Programming,OOP)。

2.需解決的問題的複雜性直接取決于抽象的類型和品質。

3.彙編語言是對底層機器的輕微抽象;”指令式“語言是對彙編語言的抽象,但是此類語言所做的主要抽象仍要求在解決問題時要基于計算機的結構,而不是基于所要解決的問題的結構來考慮。

4.OOP允許根據問題來描述問題,而不是根據運作解決方案的計算機來描述問題。

5.Alan Kay總結了第一個成功的面向對象語言、同時也是Java所基于的語言之一的Smalltalk的五個基本特性,這些特性表現了一種純粹的面向對象程式設計方式。

(1)萬物皆為對象

(2)程式是對象的集合,它們通過發送消息來告知彼此要做的

(3)每個對象都有自己的由其他對象所構成的存儲

(4)每個對象都擁有其類型

(5)某一特定類型的所有對象都可以接收同樣的消息

6.Booch對對象提出了一個更簡潔的描述:對象具有狀态、行為和辨別。

7.類描述了具有相同特性(資料元素)和行為(功能)的對象集合,所有一個類實際上就是一個資料類型。

8.程式員可以根據需求通過定義新的類來适應問題,即通過添加新的資料類型來擴充程式設計語言,程式設計系統欣然接收新的類,并且像對待内置類一樣地照管它們和進行類型檢查。

9.UML(Unified Modelling Language,統一模組化語言)形式的圖:每個類都由一個方框表示,類名在方框頂部,資料成員在方框中間部分,方法在方塊底部。通常,隻有類名和公共方法被示于UML設計圖中。如果隻對類型感興趣,那麼方塊底部也不需要給出。

10.當年試圖開發或了解一個程式設計時,最好的方法之一就是将對象想象為”服務提供者”。程式本身将向使用者提供服務,它将通過調用其他對象提供的服務來實作這一目的。你的目标就是去建立(或者最好在現有代碼庫中尋找)能夠提供理想的服務來解決問題的一系列對象。

11.将對象看作服務提供者,有助于提供對象的内聚性。高内聚時軟體設計的基本品質要求之一:意味着一個軟體構件的各方面“組合”得很好。

12.在良好的面向對象設計中,每個對象都可以很好地完成一項任務,但是它并不試圖做更多的事。

13.程式開發人員按照角色分為:類建立者(那些建立新資料類型的程式員)和用戶端程式員(那些在其應用中使用資料類型的類消費者)。

14.類建立者的目标是建構類,這種類隻向用戶端程式員暴露必須的部分,而隐藏其他部分,被隐藏的部分通常代表對象内部脆弱的部分,它們很容易被粗心或不知内情的用戶端程式員所毀壞,隐藏實作隐藏起來可以減少程式bug;用戶端程式員的目标是收集各種用來實作快速應用開發的類。

15.通路控制的第一個原因就是讓用戶端程式員無法觸及他們不應該觸及的部分;第二個原因就是允許庫設計者可以改變類内部的工作方式而不用擔心會影響到用戶端程式員。

16.最簡單的複用某個類的方式就是直接使用該類的一個對象,如果将其置于某個新的類中,則稱為在此類中建立了一個成員對象,這種概念被稱為 “組合”(has-a關系),如果組合是動态發生的,則被稱為“聚合”。

17.繼承如果隻覆寫了基類的方法,則意味着導出類(也稱為繼承類或子類)和基類(也成為源類、超類或父類)是完全相同的類型,因為它們有完全相同的接口,可用一個導出類對象來完全替代一個基類對象,這被視為純粹替代,通常稱為替代原則,基類與導出類的關系為**(is-a關系)。導出類中如果添加了新方法**,則為**(is-like-a關系)**,導出類擴充了接口,雖然新類型仍可替代基類,但這種替代并不完美,因為基類無法通路新添加的方法。

18.把一個對象不當作它所屬的特定類型來對待,而是将其當作基類的對象來對待,這使得人們可以編寫出不依賴特定類型的代碼,且易于擴充,這種操作稱為泛化。

19.一個非面向對象程式設計的編譯器産生的函數調用會引起所謂的前期綁定,意味着編譯器将産生對一個具體函數名字的調用,而運作時将這個調用解析到将要被執行的代碼的絕對位址;在OOP中,采用後期綁定,編譯器確定被調用方法的存在,并對調用參數和傳回值執行類型檢查(無法提供此類保證的語言稱為弱類型語言),但是并不知道要被執行的确切代碼,程式直到運作時才能确定代碼的位址。為了執行後期綁定,Java使用一小段特殊的代碼來替代絕對位址調用,這段代碼使用在對象中存儲的資訊來計算方法體的自制。

20.Java是單根繼承結構,所有類都繼承自Object類,單根繼承保證所有對象都具備某些功能,例如,所有對象可以很容易地在堆上建立,被垃圾回收器回收。

21.C++則無法確定所有對象都屬于同一個基本類型,從向後相容的角度看,這能更好地适應C模型,而且受限少,但在引用新類庫時,需要解決相容問題(有可能要通過多重繼承)。

22.Java中,容器類型持有對其中對象的引用,可以随時擴充容器。容器有多種類型,如List(用來存儲序列),Map(也成為關聯數組,用來建立對象之間的關聯),Set(每種對象類型隻持有一個),以及隊列、樹、堆棧等構件。

23.ArrayList和LinkedList可以了解為對象的動态數組和連結清單,二者的存取特點和插入删除類似數組與連結清單,當不确定用哪一種時,可用二者的接口List,将容器之間進行轉換時對代碼的影響降低到最小。

24.容器+單根繼承結構意味着存儲Object類型的容器可存儲任何類型,當向此種容器中置入對象時,對象引用被置入,且被向上轉型為Object,當把它取回時,擷取了一個Object對象的引用,是以需向下轉型為其原本類型。

25.向上轉型是安全的;向下轉型是不安全的,而解決方案為Java中的泛型。

26.Java在被稱為堆的記憶體池中動态地建立對象,直到運作時(運作相關代碼那一刻)才知道需要多少對象,它們的生命周期如何,以及具體類型是什麼。如果需要一個新對象,可以在需要的時候在堆中建立,因為存儲空間在運作時被動态管理,所有需要大量時間在堆中配置設定存儲空間;C++則将對象置于對戰或靜态存儲區域内來實作,對象的存儲空間和聲明周期可以在編寫程式時确定,在堆棧中建立存儲空間和釋放存儲空間通常各需一條彙編指令即可,分别對應将棧頂指針向下移動和向上移動。前者效率相對較低(程式較複雜時此開銷将微乎其微)但友善,後者效率高但需要頻繁考慮記憶體洩漏問題。

end.名詞科普(來自百度百科):

(1)LISP語言(LISP,List Processing的縮寫):創始時間為1958年,是一種早期開發的、具有重大意義的自由軟體項目。它适用于符号處理、自動推理、硬體描述和超大規模內建電路設計等。特點是,使用表結構來表達非數值計算問題,實作技術簡單。LISP語言已成為最有影響,使用十分廣泛的人工智能語言。

(2)Prolog(Programming in logic):是一種面向演繹推理的邏輯型程式設計語言,最早于1972年由柯爾麥倫納(Colmeraner)及其研究小組在法國馬賽大學提出。

(3)Smalltalk:Smalltalk語言仍被認為是最具有代表性和運用最廣泛的面向對象程式設計語言。Smalltalk語言的前身叫做Flex系統,最早是由Alan Kay提出的,Smalltalk簡單易學,使用友善,因為它的句法和語義比較簡單,并且涉及的概念不多。對象、類、消息和方法等少數幾個概念就構成Smalltalk的程式設計基礎。

(4)Booch:Booch方法是早期面向對象的軟體開發方法的一種,Booch認為軟體開發是一個螺旋上升的過程,每個周期包括4個步驟,分别是辨別類和對象、确定類和對象的含義、辨別關系、說明每個類的接口和實作。Booch方法的開發模型包括靜态模型和動态模型,靜态模型分為邏輯模型(類圖、對象圖)和實體模型(子產品圖、程序圖),描述了系統的構成和結構。動态模型包括狀态圖和時序圖。