與您共讀《Java 編程思想》page 1-20
對象導論
1.1 抽象過程
所有編程語言都提供了抽象機制,人們所能解決問題的複雜性直接取決於抽象的類型和質量。
面向對象思想: 程序可以通過添加新類型的對象時自身適用於某個特定的問題。
面向對象的五個基本特性(Alan Kay)
- 萬物皆對象(奇特的變量、存儲數據、執行操作)
- 程序是對象的集合,他們通過發送消息來告知彼此所要做的。(消息:對某個特定對象方法調用的請求)
- 每個對象都有自己的由其它對象構成的存儲。(程序的複雜性隱藏在對象的簡單性背後)
- 每個對象都擁有其類型(每個對象都是一個class的instance)
- 某個特定類型的所有對象都可以接收同一類型的消息。
對象具有狀態、行爲和標識(Booch)
- 內部數據:狀態
- 方法:產生行爲
- 內存地址:標識
1.2 每個對象都有一個對象
接口是確定了對某一特定對象所能發出的請求。
1.3 每個對象都提供服務
把對象看做服務提供者,有助於提高對象的內聚性。高內聚是軟件的基本質量要求之一。
1.4 被隱藏的具體實現
- 類創建者:創建數據類型的程序員
- 客戶端程序員:在應用中使用數據類型的程序員
訪問控制
- 客戶端程序員無法觸及他們不應該觸及的部分
- 允許庫設計者可以改變內部類的工作方式二不用擔心會影響客戶端程序員
訪問指定詞(access specifier)
- public
- private
- protected
包訪問權限
1.5 複用具體實現
代碼複用是面嚮對象語言提供的最了不起的特性之一。
- 直接使用對象
- 創建一個成員對象(組合 has-a)
1.6 繼承(extends)
- 添加新方法
- 覆蓋(overriding)
1.7 伴隨多態的可換對象
導出類看做基類的過程爲向上轉型(upcasing)
1.8 單根繼承結構
- 所有對象具有共同的接口
- 所有對象具備某些功能
- 是垃圾回收機制簡化
1.9 容器
- List(存儲序列)
- Map(關聯數組,建立對象之間的關聯)
- Set(每種對象只持有一個)
- 其它:隊列、數、堆棧等
容器選擇
- 不同容器提供了不同類型的接口和外部行爲
- 不同容器對某些操作的效率不同
ArrayList和LinkedList對比
- 提供的接口和外部行爲相同
- ArrayList隨機訪問數據花費時間相同
- LinkedList隨機選取元素需要在列表中移動,越接近表尾時間越長
- 插入元素LinkedList的花費比ArrayList小
參數化類型(泛型)
參數化類型傳遞機制就是編譯器可以自動定製作用於特定類型的類。
使用一堆尖括號,中間包括類型信息。
// 一個存儲Shape對象的容器
ArrayList<Shape> shape = new ArrayList<Shape>();
1.10 對象的創建和生命週期
內存何時釋放的問題?
- 方式一:C++認爲效率控制是重要的議題
- 對象的存儲空間和生命週期可以再編寫程序書確定,將對象置於堆棧(自動變量(automatic variable)或限域變量(scoped variable))或靜態存儲區來實現
- 犧牲了靈活性,編寫程序時必須知道對象的確切數量、生命週期和類型
- 堆(heap)
- 在堆內存中動態創建對象
- 運行時才知道有多少對象及生命週期等
- 靈活
Java完全採用動態內存分配方式,通過垃圾回收機制確定對象何時銷燬
異常處理
Java內置異常處理機制,並且強制使用。它是唯一可接受的錯誤報告方式。
併發編程
- 併發和並行
- 資源共享
1.13 Java與Internet
客戶/服務器技術
- 中央信息存儲池:存儲數據、分發
- 客戶機
- 事務處理
- 中間件將負載分散給服務器端的其他機器
- web就是一臺巨型服務器
客戶端編程
- 最初的 “服務器-瀏覽器”設計 提供交互性,交互有服務器提供
- 客戶端HTML通過通用網關(common gateway interface,CGI)傳遞
- 網站可以完全建立在CGI,CGI幾乎可以做任何事情
- 構建CGI程序之上的網站可能會變得複雜而難以維護,併產生響應時間過長的問題