1: Introduction to Objects(對象簡介)

抽象的過程
問題空間的元素同它在解決空間的表述稱為“對象”。(此外還需要一些在問題空間并無對照的對象。)
面向對象的編程(Object-oriented programming,縮寫是OOP)方法:
1. 萬物皆對象。
2. 程序就是一組相互之間傳遞消息,告訴對方干些什么的對象。
3. 每個對象都利用別的對象來組建它自己的記憶。
4. 對象都有類型。
5. 所有屬于同一類型的對象都能接受相同的消息。
對象有狀態、行為和標識。

對象有接口
類是一組具有相同特征(數據元素)和行為(功能)的對象,所以實際上類是一種數據類型。
區別:類是程序員為解決特定問題而定做的,而數據類型是為了表示機器的存儲單元而設計的,它是現成的,是程序員無可奈何時的選擇。

對象會提供服務
優點:能提高對象的內聚性(cohesion)。內聚性高是高質量的軟件設計的一個基本要求:就是說軟件的各種組件(比如對象,也可以是方法或類庫)應該能很好的“組裝在一起”。

隱藏實現
public表示后面跟著的東西誰都能用。
而private關鍵詞則表示,除非是類的創建者用這個類的方法進行訪問,否則沒人能訪問到這個元素。private是豎在你與客戶程序員之間的一堵墻。那些要訪問private成員的人,會在編譯的時候得到一個錯誤。
protected關鍵詞很像private,它們的區別在于,繼承類能夠訪問protected成員,但是不能訪問private成員。
Java還有個“缺省”的訪問權限,如果你沒用上面三個的話,那就是指它了。通常把它成為package訪問權限。因為同屬這個package的類可以訪問這個package中其它類的“缺省權限”的成員,但是出了這個package,它們就都是private的了。

復用實現
由于是用已有的類來合成新的類,因此這一概念被成為合成(composition,如果這個對象是動態的,通常把它成為聚合aggregation)。通常將合成稱為“有(has-a)”關系,就像“轎車有引擎”。
合成具有極大的靈活性。

繼承:復用接口
你有兩種辦法來區分新的派生出來的類和那個原來的基類。
1. 直接往派生類里加新的方法。
2. 也是更重要的區分方法是在新的類中修改基類方法的行為。這被稱為覆寫(override)那個方法。
“是”與“像”的關系
1. 結果是能用派生類的對象直接替換基類的對象。可以把這種情況想成完全替換(pure substitution),通常被稱為替換原則(substitution principle)。從某種意義上講,這是使用繼承的理想方法。通常我們把基類同派生類的這種關系稱作是(is-a)關系。
2. 基類還是可以被新的類所替代,但是這種替換是不完全的,因為的方法無法通過基類的接口訪問。這可以被稱為“像(is-like-a)”關系。

可憑借多態性相互替換的對象
非OOP的編譯器的做法被稱為前綁定(early binding)。在OOP中,不到運行的時候,程序沒法確定代碼的地址,所以向泛型對象發送一個消息的時候,就要用到一些特別的手段。為了解決這個問題,OOP語言是用了后綁定(late binding)的概念。
將派生類當作它的基類來用的過程稱為上傳(upcast)。
abstract基類和interface
abstract方法只能存在于abstract類里。如果有個類繼承了abstract類,那么它要么實現這個方法,要么也是一個abstract類。abstract方法能讓你將方法放到接口而不必為它寫一些無意義的代碼。
interface關鍵詞更是對abstract類的概念的深化,它不允許你實現任何方法。interface是個很趁手也很常用的工具,因為它能徹底地將接口與實現分離開來。此外如果你愿意,還可以繼承多個接口,因為要繼承多個常規或是抽象類是不允許的。

對象的創建,使用和生命周期
1. 在寫代碼的時候決定將對象放到棧里(有時會被稱為automatic或scoped的變量)或是靜態的存儲區域。(C++,速度快)
2. 在一個被稱為堆的內存池里動態地創建對象。(Java,靈活性高)
(在棧中分配存儲空間通常只需一個匯編指令,把棧指針向下移就行了,想把指針指回來也只要一條指令。而堆的存儲分配則取決于存儲機制的設計。)
Collection和迭代器
List類(以持有線性序列)
Map類(也稱為關聯性數組associative arrays,將一個對象同另一個對象關聯起來)
Set類(不持有兩個相同的對象)
單根繼承體系
Java(實際上除了C++所有其它OOP語言)的回答是,是的,而這個最終的基類就叫Object.
下傳與模板/泛型
沿著繼承圖向下傳給一個更為具體的類型,這種方式稱為下傳(downcast)。
上傳很安全,下傳十有八九是不安全的。
參數化類型(parameterized type)是一種能夠根據需要由編譯器自動指派類型的類。(C++:template/Java:generics)
確保正確地清除
Java設計了一個垃圾回收器來處理釋放內存的問題(僅此而已,不包括清除對象的其它方面)。
垃圾回收器的效率與靈活性
C++:編程復雜性較高
Java:效率和適用性較差

異常處理:與錯誤打交道
盡管在面向對象的語言中異常通常以對象的形式出現,但異常處理并不是一種面向對象的特性。異常處理在面向對象的語言問世之前就已經有了。

并發
Java能鎖定任何對象的內存(畢竟這也是一種共享資源),這樣同一時刻就只有一個線程能夠訪問這些內存。這是由synchronized關鍵詞來做的。其它資源就得靠程序員自己來鎖定了。通常可以創建一個表示這項資源的對象,然后讓線程在訪問資源之前先檢查一下。

Persistence
輕量級的presistence既可以通過對象的序列化(object serialization),也可以通過數據對象(Java Data Object,簡稱JDO)來實現。

Java和Internat
Web是什么?
客戶/服務器系統
把Web當作巨型的服務器
客戶端編程
插件
腳本語言
Java
.NET和C#
安全性
Internet和Intranet
服務器端編程
應用程序

Java為什么能成功
系統能更易于表述和理解
最大程度上利用類庫
錯誤處理
編寫大項目
Java還是C++?

總結

「讀書筆記」Thinking in Java 3rd Edition - 2: Everything is an Object