1.1 抽象過程
所有程式設計語言都提供抽象機制。人們能解決的問題的複雜性直接取決於抽象的
類型和品質。 1 建立機器模型和實際待解問題的模型之間的關聯:費力、難以編寫 2 針對待解問題建模:針對特定問題是好方案、但局限性太強。 3 物件導向方式: 程式可以通過添加新類型的對象使自身適用於某個特定問題。當閱讀描述解決方案的代碼時,也是在閱讀問題的表述。物件導向的基本特性 1 萬物皆為對象 2 程式是對象的集合,對象之間通過發送訊息來通訊。 3 每個對象中可包含其他對象,可構建複雜的體系。 4 每個對象都擁有其類型 5 某一特定類型的所有對象都可以接收同樣的訊息。
1.2 每個對象都有一個介面
可以建立某一類型的變數,然後操作這些變數。每個類的成員或元素都具有某種共性:每個賬戶都有結餘金額;同時,每個成員都有其自身的狀態:每個賬戶都有不同的結餘金額。每一個對象都屬於定義了特性和行為的某個特定的類。 因為類描述了具有相同特性和行為的對象集合,程式員通過定義類來適應問題,而不再被迫只能使用現有的用來表示機器中的儲存單元的資料類型。可以根據需求,添加新的資料類型來擴充程式設計語言,編程系統接受新的類,並像對待內建類型一樣照管它們和進行類型檢查。 物件導向的挑戰之一就是在問題空間的元素和解空間的對象之間建立一對一的映射。如何擷取有用的對象?必須有某種方式產生對對象的請求,使對象完成各種任務,如完成一筆交易。每個對象都只能滿足某些請求,這些請求由對象的interface所定義。 介面確定了對某一特定對象所能發出的請求,在程式中必須有滿足這些請求的代碼,這些代碼與隱藏的資料一起構成了實現。
1.3 每個對象提供服務
將對象看為服務提供者: 目標就是建立能夠提供理想服務來解決問題的一系列對象。 有助於提供對象的內聚性。每個對象都可以很好的完成一項任務,但並不試圖做更多的事。
1.4 被隱藏的具體實現
程式開發人員分為類建立者(建立新資料類型)和用戶端程式員(使用新資料類型)。 類建立者的目標是構建類,這些類只向用戶端程式員暴露必須的部分,而隱藏其他部分。好處在於隱藏的部分用戶端無法訪問,建立者可以任意修改隱藏的部分。
1.5 複用具體實現 先組合,再繼承。避免過分複雜的設計。
1.6 繼承 可通過繼承來構建一個類型階層,以此來表示待求解的某種類型的問題。 當繼承現有類型時,也就創造了新的類型,這個新的類型不僅包括現有類型的所有成員,而且更重要的是它複製了父類的介面,也就是說,所有可以發送給基類對象的訊息同時也可以發送給匯出類對象。由於通過發送給類的訊息的類型可知類的類型,也意味著匯出類與基類具有相同的類型。 由於基類與匯出類具有相同的基礎介面,所以伴隨此介面的必定有某些具體實現,也就是說當對象接受到特定訊息時,必須有某些代碼去執行。 有兩種方法可以使基類與匯出類產生差異: 1 在匯出類中添加新方法 2 overriding 改變基類方法 繼承包括 純粹替代(is-a)和非純粹替代(is-like-a)
1.7 伴隨多態的可互換對象
在處理類型的階層時,經常想把一個對象不當做它所屬的特定類型來對待,而是將其當做其基類的對象來對待,這使得人們可以編寫出不依賴於特定類型的代碼。 通過匯出新的子類型而輕鬆擴充設計的能力是對改動進行封裝的基本方式之一,可改善設計,降低軟體維護代價。 直接調用泛化基類的方法時,泛化基類必須去調用對應的匯出類型的方法,但如何知道調用哪個匯出類型呢?(即實現多態) 通過後期綁定。當向對象發送訊息時,被調用的代碼直到運行時才能確定,編譯器確保被呼叫者法的存在,並對調用參數和傳回值進行類型檢查,但是不知道將被執行的確切代碼。
1.8 單根繼承結構 所有類都繼承自Object類。 單根繼承結構保證所有對象都具備某些功能。因此,在你的系統中你可以在每個對象上執行某些基本操作,所有對象都可以很容易的在堆上建立,而參數傳遞也得到了極大的簡化。 單根繼承結構使記憶體回收行程的實行變得容易的多。由於所有對象都保證具有類型資訊,因此不會因無法確定對象的類型而陷入僵局,對於系統級的操作(如異常處理)顯得尤其重要,更為靈活。
1.9 容器 Java中有滿足不同需要的各種類型的容器,如List(用於儲存序列),Map(也被稱為關聯陣列,用於建立對象之間的關聯),Set(每種物件類型只持有一個),以及諸如隊列、樹、堆棧等更多的構件。 在Java SE5之前,容器儲存的對象都為Object類型,因此可以儲存任何東西,容易複用。但此時的容器存入時需向上轉型為Object,造成類型資訊丟失,取出時必須對其進行手動的向下轉型,向下轉型有可能會出現執行階段錯誤,是不安全行為。 泛型的出現解決了這一問題,如 ArrayList<Shape> shapes=new ArrayList<Shape>(); 此處定製了一個只接納和取出shape對象的容器。泛型可以避免轉型錯誤和轉型消耗的時間。
1.10 對象的建立和生命期 Java完全採用動態記憶體分配方式。每當想要建立新對象時,就要使用new 關鍵字來構建此對象的動態執行個體。 Java的記憶體回收行程被設計用來處理記憶體釋放問題。記憶體回收行程知道對象何時不再被使用,並自動釋放對象佔用的記憶體。這一點同所有對象都是繼承自單根基類Object以及只能以一種方式建立對象(在堆上建立)這兩個特性結合起來,使Java編程容易的多。
1.11 異常處理 Java內建了異常處理,且強制必須使用。它是唯一可接受的錯誤報表方式,如果沒有編寫正確的處理異常的代碼,就會得到一條編譯時間的出錯資訊。
1.12 並發編程 有時中斷對於處理時間性比較強的任務是必需的,但對於大量的其他問題,我們只是想把問題切分成多個可獨立啟動並執行部分,從而提高程式的響應能力。這些彼此獨立啟動並執行部分稱為線程。 一個隱患為:共用資源。因此,整個過程是:某個任務鎖定其資源,完成其任務,然後釋放資源鎖,使其他任務可以使用該項資源。