java編程思想-第一章對象導論精簡

1.1抽象過程

人們所能夠解決的問題的複雜性直接取決於抽象的類型和質量。將現實世界中的問題轉化爲抽象世界中的元素。
在彙編語言時代,抽象過程是:將所要解決的問題的結構映射爲計算機的結構。因爲彙編語言是對底層機器的輕微抽象。
這種映射非常費力,且維護代價高昂。
面向對象(OOP)根據問題來描述問題,將問題空間中的元素及其在解空間中的表示均稱爲“對象”。
面向對象程序的特點:
1)萬物皆爲對象
2)程序時對象的集合,它們通過發送消息來告知彼此所要做的
3)每個對象都有自己的由其他對象所構成的存儲
4)每個對象都有其類型

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

對象具有狀態、行爲和標識

1.2每個對象都有一個接口 

每個對象都只能滿足某些請求,這些請求由對象的接口所定義,決定接口的便是類型。
接口確定了對某一特定對象所能發出的請求。

在程序中必須有滿足這些請求的代碼,這些代碼與隱藏的數據一起構成了實現。

在類型中,每一個可能的請求都有一個方法與之相關聯,當向對象發送請求時,與之相關聯的方法就會被調用。

1.3每個對象都提供服務

當正在試圖開發或理解一個程序設計時,最好的方法之一就是將對象想象爲“服務提供者”。
將對象看作是服務提供者還有一個附帶的好處:它有助於提高對象的內聚性。
高內聚是軟件設計的基本質量要求之一:這意味着一個軟件構件的各個方面“組合”的很好。

人們在設計對象時所面臨的一個問題是,將過多的功能都塞在一個對象中。

而在良好的面向對象設計中,每個對象都可以很好地完成一項任務。

1.4被隱藏的具體實現

 將程序開發人員按照角色分爲類創建者(那些創建新數據類型的程序員)
客戶端程序員(那些在其應用中使用數據類型的類消費者)。
 對於類內容的具體實現,對客戶端程序員施加訪問控制有兩個原因:
1)客戶端程序員無法觸及他們不應該觸及的部分
2)允許庫設計者可以改變類內部的工作方式而不用擔心會影響到客戶端程序員

Java用三個關鍵字在類的內部設定邊界:public、private、protected

Java有一種默認的訪問權限:包訪問權限,即類可以訪問在同一個包中的其他類的成員,但是在包外,這些成員如同指定了private。

1.5複用具體實現

 產生一個可複用的對象設計需要豐富的經驗和敏銳的洞察力。
代碼複用是面向對象程序設計語言所提供的的最了不起的優點之一。
 複用類的方式:1.直接使用類對象,2在新類中創建成員對象。
組合的概念:使用現有的類合成新的類。即“has-a”(擁有)關係,如“汽車擁有引擎”
聚合:組合是動態發生的。
在創建新類時,應該首先考慮組合,因爲它相比於繼承更加簡單靈活。

1.6繼承

 兩種方法使基類與導出類產生差異:1.直接在導出類中添加新方法,2.改變現有基類的方法的實現(稱之爲覆蓋overriding)

這樣基類與導出類的關係分別對應着:"是一個"(is-a)和像是一個(is-like-a)。

是一個”也可被視爲純粹替代,通常稱爲替代原則

1.7伴隨多態的可互換對象

前期綁定:非面向對象編程的編譯器會產生對具體函數名字的調用,運行時將這個調用解析到將要被執行的代碼的絕對地址。

後期綁定:在OOP中,揹帶敖勇的代碼直到運行時才能確定。

爲了執行後期綁定,Java使用一小段特殊的代碼來替代絕對地址調用。這段代碼使用在對象中存儲的信息來計算方法體的地址。

在某些語言中,必須明確地聲明希望某個方法具備後期綁定屬性所帶來的靈活性(C++是使用virtual關鍵字來實現),

在這些語言中,方法在默認情況下不是動態綁定的。

在Java中,動態綁定是默認的。

1.8單根繼承結構

在OOP中,所有的類最終都繼承自單一的基類

單根繼承結構使垃圾回收器的實現變得容易的多,而垃圾回收器正是Java相對C++的重要改進之一。

由於所有對象都保證具有其類型信息,因此不會因無法確定對象的類型而陷入僵局。

這對於系統級操作(如異常處理)顯得尤爲重要,並且給編程帶來了更大的靈活性。

1.9容器

在解決特定問題時,不能事先知道需要多少個對象,或者對象存活多久,這樣就不知道如何存儲這些對象以及需要的空間,因爲只有在運行時才能知道。

於是創建另一種對象類型(Java中稱爲容器)應運而生,這種新的對象類型持有對其他對象的引用。

1.9.1參數化類型

Java SE5的重大變化之一就是增加了參數化類型,即泛型。一對尖括號,中間包含類型信息,通過這些特徵就可以識別對泛型的應用。

ArrayList<Shape> shapes = new ArrayList<Shape>();

在Java SE5出現之前,容器存儲的對象都只具有Java中的通用類型:Object。單根繼承結構意味着所有對象類型都是Object類型,
所以可以存儲Object的容器可以存儲任何對象。當將對象A引用置入容器時,對象必須被向上轉型爲Object,此時會丟失其身份(A類型)。
當取出對象A時,就只能獲取到Object對象的引用,而不是置入時的那個類型A。這時就需要用到向下轉型,我們知道,向上轉型是安全的。
例如:Circle是一種Shape類型,但是不知道某個Object是Circle還是Shape,所以除非確切知道所要處理的對象的類型,否則向下轉型幾乎是不安全的。
然而向下轉型並非徹底是危險的,因爲如果向下轉型爲錯誤的類型,就會得到被稱爲異常的運行時錯誤。

所以,當從容器中取出對象引用時,有必要知道這些這些對象的類型,這樣才能執行正確的向下轉型。

參數化類型就可以解決不需要向下轉型且能消除犯錯誤的可能,就顯得非常有意義。

1.10對象的創建和生命期

爲了保證較高的靈活性,Java採用了動態內存分配方式,即在堆中動態的創建對象。這種方式下,直到運行時才知道對象類型、對象數量、生命週期等。

爲了及時回收對象佔用的空間,Java採用了垃圾回收機制。垃圾回收器“知道”對象何時不再被使用,並自動釋放對象佔用的內存。

這一點同所有對象都是繼承自單根基類Object以及只能在堆上創建對象這兩個特性結合起來。

1.11異常處理:處理錯誤

Java語言中內置了異常處理,並且強制你必須使用它。它是唯一可接受的錯誤報告方式,如果沒有編寫正確的處理異常的代碼,就會得到一條編譯時的出錯消息。

異常處理不是面向對象的特徵,因爲異常處理在面嚮對象語言出現之前就已經出現了。

1.12併發編程

Java語言中內置了併發,Java SE5增添了大量額外的庫支持。

1.13Java與Internet

1.13.1 Web是什麼

1)客戶/服務器計算技術

2)Web就是一臺巨型服務器

1.13.2客戶端編程

1)插件

2)腳本語言

3)java,java中的applet是隻在Web瀏覽器中運行的小程序。但是運行applet需要安裝java運行時環境(JRE),這使得Java applet始終沒有得到大規模應用

4).NET和C#

 .NET平臺大致相當於Java虛擬機(JVM,即執行Java程序的軟件平臺)和Java類庫。

1.13.3服務器端編程

基於Java的Web服務器,使用Java編寫servlet的程序來實現服務器端編程。

1.14總結

編寫良好的Java 程序比過程型程序要簡單的多,而且也易於理解的多。

Java中涉及兩部分內容的定義:

 用來表示問題空間概念的對象

 發送給這些對象的用來表示在此空間內的行爲的消息





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章