第一章對象引論
抽象過程
1.萬物皆為對象2.程式是對象的集合,它們彼此通過發送消息來調用對方.3.每個對象都擁有由其它對象所構成的存儲.4.每個對象都擁有其類型(Type).5.某一特定類型的所有對象都可以接收(Receive)同樣的消息。
每個對象都有一個接口
必須有某種方式産生對對象的請求,使對象完成諸如完成一筆交易、在螢幕上畫圖、打開開關之類的任務。每個對象都隻能滿足某些請求,這些請求由對象的接口(Interface)所定義,決定接口的便是類型(Type)。接口定義了你能夠對某一特定對象發出的請求。但是,在程式中必須有滿足這些請求的代碼。這些代碼與隐藏的資料一起構成了實作(implementation)。
每個對象都提供服務
被隐藏的具體實作
複用具體實作
最簡單的複用某個類的方式就是直接使用該類的一個對象,此外你也可以将該類的一個對象置于某個新的類中。我們稱其為“建立一個成員對象”。新的類可以由任意數量、任意類型的其它對象以任意可以實作新的類中想要的功能的方式所組成。因為你在使用現有的類合成新的類,是以這種概念被稱為組合(composition),如果組合式動态發生的,那麼它通常被稱為聚合(aggregation)。
由于繼承在面向對象程式設計中如此重要,是以它經常被高度強調,于是程式員新手就會有這樣的印象:處處都應該使用繼承。這會導緻難以使用并過分複雜的設計。實際上,在建立新類時,你應該首先考慮組合,因為它更加簡單而靈活。如果你采用這種方式,你的設計會變得更加清晰。一旦有了一些經驗之後,你便能夠看透必須使用繼承的場合。
繼承:複用接口
有兩種方法可以使基類與導出類産生差異。第一種方法非常直接:直接在導出類中添加新方法。這些新方法并不是基類接口的一部分。這意味着基類不能直接滿足你的所有需求,是以你必需添加更多的方法。第二種以及其它使導出類和基類之間産生差異的方法是改變現有基類的方法的行為。這被稱之為重載(overriding)。
伴随多态的可互換對象
為了執行後期綁定,Java 使用一小段特殊的代碼來替代絕對位址調用。這段代碼使用在對象中存儲的資訊來計算方法體的位址.
抽象基類和接口
你不希望任何人創
建基類的實際對象,而隻是希望他們将對象向上轉型到基類,是以它的接口将派上用場。這是通過使用abstract 關鍵字把類辨別成為抽象類來實作的。如果有人試圖建立一個抽象類的對象,編譯器都會加以阻止.
你也可以使用 abstract 關鍵字來描述尚未被實作的方法,就象一個存根,用來表示“這是一個從此類中繼承出的所有類型都具有的接口方法,但是此刻我沒有為它設計任何具體實作。”抽象方法隻能在抽象類内部建立,當該類被繼承時,抽象方法必須被實作,否則繼承類仍然是一個抽象類.
對象的建立、使用和生命周期
為了追求最大的執行速度,對象的存儲空間和生命周期可以在編寫程式時确定,這可以通過将對象置于堆棧(它們有時被稱為自動變量(automatic variable)或限域變量(scopedvariable))或靜态存儲區域内來實作。這種方式将存儲空間配置設定和釋放置于優先考慮的位置,某些情況下這樣控制非常有價值,但是,也犧牲掉了靈活性,因為你必須在編寫程式時知道對象确切的數量、生命周期和類型
第二種方式是在被稱為堆(heap)的記憶體池中動态地建立對象。這些問題的答案隻能在程式運作時相關代碼被執行到的那一刻才能确定。如果你需要一個新對象,你可以在你需要的時刻直接在堆中建立。因為存儲空間是在運作時刻被動态管理的,是以需要大量的時間在堆中配置設定存儲空間,這可能要遠遠大于在堆棧中建立存儲空間的時間。
Java完全采用了第二種方式6。每當你想要建立新對象時,就要使用new關鍵字來建構此對象的動态執行個體。
Java 提供了被稱為“垃圾回收器(garbage collector)”的機制,它可以自動發現對象何時不再被使用,并繼而銷毀它。垃圾回收器非常有用,因為它減少了你必須考慮的議題和你必須編寫的代碼。更重要的是,垃圾回收器提供了更高層的保障,可以避免暗藏的記憶體洩漏問題.
集合(collection)與疊代器(iterator)
向下轉型(downcasting)與模闆/泛型(template/generic)
確定正确清除
Java 的垃圾回收器被設計用來處理記憶體釋放問題(盡管它不包括清除對象的其他方面)。垃圾回收器“知道”對象何時不再被使用,并自動釋放該對象的記憶體.
垃圾回收與效率和靈活性
異常處理:處理錯誤
并發(concurrency)
在程式中,這些彼此獨立運作的部分稱之為線程(thread),上述概念被稱為“并發(concurrency)”或“多線程(multithreading)”。
持久性 輕量級持久性可以通過對象序列化