On Java 8閱讀筆記
寫在前面的話
第一章物件的概念
抽象
- 所有程式語言都提供抽象機制,問題的複雜度取決於抽象的型別和質量。
- 面向物件程式設計方法的基本特徵:
- 1.萬物皆物件。
- 2.程式是一組物件,通過訊息傳遞來告知彼此該做什麼。要請求呼叫一個物件的方法,你需要向該物件傳送訊息。
- 3.每個物件都有自己的儲存空間,可容納其它物件。或者說,通過封裝現有物件,可製作出新型物件。所以儘管物件的概念非常簡單,但在程式中卻可達到任意高的複雜程度。
- 4.每個物件都有一種型別。根據語法,每個物件都是某個"類"的一個"例項"。其中,“類”(Class)是"型別"(Type)的同義詞。一個類最重要的特徵就是"能將什麼訊息發給它?"。
- 5.同一類所有物件都能接收相同的訊息。這實際是別有含義的一種說法,大家不久便能理解。由於型別為"圓"(Circle)的一個物件也屬於型別為"形狀"(Shape)的一個物件,所以一個圓完全能接收發送給"形狀"的訊息。這意味著可讓程式程式碼統一指揮"形狀",令其自動控制所有符合"形狀"描述的物件,其中自然包括"圓"。這一特性稱為物件的"可替換性",是OOP最重要的概念之一。
物件的簡潔描述:一個物件具有自己的狀態、行為和標識。這意味著物件有自己的內部資料(提供狀態)、方法(產生行為),並彼此區分(每個物件在記憶體中都有唯一的地址)。
介面
所有物件都是唯一的,但同時也是具有相同的特性和行為的物件所歸屬的類的一部分。
- 當你看到"type"這個詞的時候,請同時想到
class
;反之亦然。
建立好一個類後,可根據情況生成許多物件。隨後,可將那些物件作為要解決問題中存在的元素進行處理。事實上,當我們進行面向物件的程式設計時,面臨的最大一項挑戰是:如何在"問題空間"(問題實際存在的地方)的元素與"方案空間"(對實際問題進行建模的地方,如計算機)的元素之間建立理想的"一對一"的對映關係。
那麼如何利用物件完成真正有用的工作呢?必須有一種辦法能向發出請求,令其解決一些實際的問題,比如完成一次交易、在螢幕上畫一些東西或者開啟一個開關等等。每個物件僅能接受特定的請求。我們向物件發出的請求是通過它的"介面"(Interface)定義的,物件的"型別"或"類"則規定了它的介面形式。"型別"與"介面"的對應關係是面向物件程式設計的基礎。
下面讓我們以電燈泡為例:
上圖遵循UML(統一建模語言)的格式。每個類由一個框表示,框的頂部有型別名稱,框中間部分是要描述的任何資料成員、方法(屬於此物件的方法,它們接收任何傳送到該物件的訊息)在框的底部。通常,只有類的名稱和公共方法在UML設計圖中顯示,因此中間部分未顯示,如本例,如果你只對類感興趣,則也不需要顯示方法資訊。
服務提供
封裝
研發程式設計師開發一個工具類,該工具類僅嚮應用程式設計師公開必要的內容,並隱藏內部實現的細節。這樣可以有效地避免該工具類被錯誤的使用和更改。只有設定訪問控制,才能從根本上阻止這種情況的發生。
因此,使用訪問控制的原因有以下兩點:
- 1.讓應用程式不要觸控他們不應該觸控的部分。(請注意,這也是一個哲學決策。部分程式語言認為如果程式設計師有需要,則應該讓他們訪問細節部分;)
- 2.使類庫建立者(研發程式設計師)在不影響後者使用的情況下完善更新工具庫。例如,我們開發了一個功能簡單的工具類,後來發現可以通過優化程式碼來提高執行速度。
Java有三個顯式關鍵字來設定類中的訪問許可權:public
(公開)、private
(私有)、protected
(受保護)。這些訪問修飾符決定了誰能使用它們修飾的方法、變數或者類。
1.public
(公開)表示任何人都可以訪問和使用該元素;
2.private
(私有)除了類本身和類內部的方法,外界無法直接訪問該元素。private
是類和呼叫者之間的屏障。任何試圖訪問私有成員的行為都會報編譯時錯誤。
3.protected
(受保護)類似於private
,區別是子類(下一節就會引入繼承
的概念)可以訪問protected
的成員,但是不能訪問private
成員;
4.default
(預設)如果你不使用前面的三者,預設就是default
訪問許可權。default
被稱為包訪問,因為該許可權下的資源可以被同一包(庫元件)中其他類的成員訪問。