天天看點

第1章 對象導論

1.1 抽象過程

Smalltalk的五個基本特征,這些特征表現了一種純粹的面向對象程式設計方式:

1)萬物皆為對象。

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

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

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

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

對象具有狀态、行為和辨別。這意味着每一個對象都可以擁有内部資料和方法,并且每一個對象都可以唯一地與其他對象區分開來,具體來說,就是每一個對象在記憶體中都有一個唯一的位址。

1.2 每個對象都有一個接口

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

每個對象都隻能滿足某些請求,這些請求由對象的接口(interface)所定義,決定接口的便是類型。

1.3 每個對象都提供服務

高内聚是軟體設計的基本品質要求之一:這意味着一個軟體構件的各個方面“組合”得很好。

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

1.4 被隐藏的具體實作

通路控制的第一個存在原因就是讓用戶端程式員無法觸及他們不應該觸及的部分。

通路控制的第二個存在原因就是允許庫設計者可以改變類内部的工作方式而不用擔心會影響到用戶端程式員。

JAVA用三個關鍵字在類的内部設定邊界:public、private、protected。這些通路指定詞決定了緊跟其後被定義的東西可以被誰使用。public表示緊随其後的元素對任何人都是可用的,而private這個關鍵字表示除類型建立者和類型的内部方法之外的任何人都不能通路的元素。private就像你與用戶端程式員之間的一股磚牆,如果有人試圖通路private成員,就會在編譯時得到錯誤資訊。protected關鍵字與private作用相當,差别僅在于繼承的類可以通路protected成員,但是不能通路private成員。

Java還有一種預設的通路權限,當沒有使用前面提到的任何通路指定詞時,它将發揮作用。這種權限通常稱為包通路權限,因為在這種權限下,類可以通路在同一個包(庫構件)中的其他類的成員,但是在包之外,這些成員如同指定了private一樣。

1.5 複用具體實作

代碼複用是面向對象程式設計語言所提供的最了不起的優點之一。

因為是在使用現有的類合成新的類,是以這種概念被稱為組合(composition),如果組合是動态發生的,那麼它通常被稱為聚合(aggregation)。

1.6 繼承

通過使用對象,類型層次結構成為了主要模型,是以可以直接從真實世界中對系統的描述過渡到代碼對系統進行描述。

類與基類具有相同的類型。

有兩種方法可以使基類與導出類産生差異。第一種方法非常直接:直接在導出類中添加新方法;第二種也是更重要的一種使導出類與基類之間産生差異的方法是改變現有基類的方法的行為,這被稱之為覆寫(overriding)那個方法。

1.7 伴随多态的可互換對象

OOP中,程式直到運作時才能确定代碼的位址,是以當消息發送到一個泛化對象時,必須采用其他的機制。

為了解決這個問題,面向對象程式設計語言使用了後期綁定的概念。當向對象發送消息時,被調用的代碼知道運作時才能确定。編譯器確定被調用方法的存在,并對調用參數和傳回值執行類型檢查(無法提供此類保證的語言被稱為是弱類型的,比如Python),但是并不知道将被執行的确切代碼。

在某些語言中,必須明确地聲明某個方法具備後期綁定特性所帶來的靈活性(C++使用virtual關鍵字來實作的)。在這些語言中,方法在預設情況下不是動态綁定的。 而在Java中,動态綁定是預設行為,不需要添加額外的關鍵字來實作多态。

1.8 單根繼承結構

這個終極基類的名字就是Object。

在單根繼承中的所有對象都具有一個共用接口,是以他們歸根結底都是相同的基本類型。

單根繼承結構保證所有對象都具備某些功能。

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

1.9 容器

第一,不用容器提供了不同類型的接口與外部行為。

第二,不同的容器對于某些操作具有不同的效率。

1.9.1 參數化類型

向上轉型是安全的,除非确切知道所要處理的對象的類型,否則向下轉型幾乎是不安全的。

參數化類型就是一個編譯器可以自動定制作用域特定類型上的類。(泛型)

1.10 對象的建立和生命期

為了追求最大的執行速度,對象的存儲空間和聲明周期可以在編寫程式時确定,這可以通過将對象置于堆棧(它們有時被稱為自動變量或限域變量)或靜态存儲區内來實作。這種方式将存儲空間配置設定和釋放置于優先考慮的位置,某些情況下這樣控制非常有價值,但是可犧牲了靈活性。

第二種方式是在被稱為堆(heap)的記憶體池中動态地建立對象。在這種方式中,直到運作時才知道需要多少對象,它們的生命周期如何,以及它們的具體類型是什麼。

動态方式帶來更大的靈活性。

Java完全采用了動态記憶體配置設定方式,每當想要建立新對象時,就要使用new關鍵字來建構此對象的動态執行個體。

Java提供了成為“垃圾回收器”的機制,它可以自動發現對象何時不再被使用,并繼而銷毀它。垃圾回收器非常有用,因為它減少了所必須考慮的議題和必須編寫的代碼。更重要的是,垃圾回收器提供了更進階的保障,可以避免暗藏的記憶體洩漏問題。

Java的垃圾回收器被設計用來處理記憶體釋放問題(盡管它不包括清理對象的其他方面)。垃圾回收器“知道”對象何時不再被使用,并自動釋放對象占用的記憶體。

1.11 異常處理:處理錯誤

Java的異常處理在衆多的程式設計語言中格外引人注目,因為Java一開始就内置了異常處理,而且強制你必須使用它,它是唯一可接受的錯誤報告方式。如果沒有編寫正确的處理異常的代碼,那麼就會得到一條編譯時的出錯資訊。這種有保障的一緻性有時會使得錯誤處理非常容易。

1.12 并發程式設計

線程隻是一種為單一處理器配置設定執行時間的手段。但是如果作業系統支援多處理器,那麼每個任務都可以被指派給不同的處理器,并且它們是在真正地并行執行。

1.13 Java與Internet

1.13.1 Web是什麼

1. 客戶/伺服器計算技術

資訊存儲池、用于分發資訊的軟體以及資訊與軟體所駐留的機器或機群被總稱為伺服器。駐留在用于機器上的軟體與伺服器進行通信,以擷取資訊、處理資訊,然後将它們顯示在被稱為客戶機的使用者機器上。

為了将延遲最小化,程式員努力減輕處理任務的負載,是以任何小的延遲都會産生重大影響,但同時也會使用所謂的中間件将負載分散給伺服器端的其他機器。(中間件也被用來提高可維護性。)

2. Web就是一台巨型伺服器

web實際上就是一個巨型客戶/伺服器系統,但稍微差一點,因為所有的伺服器和客戶機都同時共存于同一個網絡中。

1.13.2 用戶端程式設計

這種送出動作通過所有的web伺服器都提供的通用網關接口(common gateway interface,CGI)傳遞。

如果你期望有一種腳本語言在web浏覽器不需要任何插件的情況下就可以得到支援,那它非JavaScript莫屬。

目前,.NET主要受攻擊的地方和人們所關心的最重要的問題就是,微軟是否會允許将它完全移植到其他平台上。微軟宣稱這樣做沒有問題,而且Mono項目已經有了一個在Linux上運作的.Net的部分實作;但是,在該實作完成以及微軟不會排斥其中的任何部分之前,.Net作為一種跨平台的解決方案仍舊是一場高風險的賭博。