1. 程式人生 > >《Java程式設計思想》第1章 物件導論

《Java程式設計思想》第1章 物件導論

第1章 物件導論


面向物件程式設計(Object-oriented Programming, OOP)

1.1 抽象過程

所謂的“型別”是指“所抽象的是什麼?”。
面嚮物件語言的五個基本特性:
1)萬物皆為物件。將物件視為奇特的變數,它可以儲存資料,除此之外,你還可以要求它在自身上執行操作。理論上講,你可以抽取待求解問題的任何概念化構件(狗,建築物,服務等),將其表示為程式中的物件。
2)程式是物件的集合,它們通過傳送訊息來告知彼此所要的

。要想請求一個物件,就必須對該物件傳送一條訊息。更具體地說,可以把訊息想象為對某個特定物件的方法的呼叫請求。
3)每個物件都有自己的由其他物件所構成的儲存。換句話說,可以通過建立包含現有物件的包的方式來建立新型別的物件。因此,可以在在程式中構建複雜的體系,同時將其複雜性隱藏在物件的簡單性背後。
4)每個物件都擁有其型別。按照通用的說法,“每個物件都是某個類(class)的一個例項(instance)”,這裡“類”就是“型別”的同義詞。每個類最重要的區別於其他類的特性就是“可以傳送什麼樣的訊息給它”。
5)某一特定型別的所有物件都可以接收同樣的訊息
一個更加簡潔的描述:物件具有狀態,行為和標識
。這意味著每一個物件都可以擁有內部資料(它們給出了該物件的狀態)和方法(它們產生行為),並且每一個物件都可以唯一地與其他物件區分開來,具體說來,就是每一個物件在記憶體中都有一個唯一的地址。

1.2 每個物件都有一個介面

建立抽象資料型別(類)是面向物件程式設計的基本概念之一。抽象資料型別的執行方法與內建(built-in)型別幾乎一致:你可以建立某一型別的變數(按照面向物件的說法,稱其為物件例項),然後操作這些變數(稱其為傳送訊息請求;傳送訊息,物件就知道要做什麼)。
因為類描述了具有相同特性(資料元素)和行為(功能)的物件集合,所以一個類實際上就是一個數據型別,例如所有浮點型數字具有相同的特性和行為集合。
每個物件都只能滿足某些請求,這些請求由物件的介面

(interface)所定義,決定介面的便是型別。以電燈泡為例來做一個簡單的比喻(如下圖所示):
在這裡插入圖片描述

Light lt = new Light();
lt.on();

介面確定了對某一特定物件所能發出的請求。但是,在程式中必須有滿足這些請求的程式碼。這些程式碼與隱藏的資料一起構成了實現。
上例中,型別/類的名稱是Light,特定的Light物件的名稱是lt,可以向Light物件發出的請求是:開啟它、關閉它、將它調亮、將它調暗。

1.3 每個物件都提供服務

將物件想象為“服務的提供者”。

1.4 被隱藏的具體實現

將程式開發成員按照角色分為類建立者(那些建立新資料型別的程式設計師)和客戶端程式設計師(那些在其應用中使用資料類的類消費者)。
訪問控制的第一個存在原因就是讓客戶端程式設計師無法觸及他們不應該觸及的部分——這些部分對資料型別的內部操作來說是必需的,但不是使用者解決特定問題所需的介面的一部分。這對客戶端程式設計師來說其實是一項服務,因為它們可以很容易的看出那些東西對他們來說很重要,而那些東西可以忽略。
訪問控制的第二個存在原因就是允許庫設計者可以改變類內部工作方式而不擔心會影響到客戶端程式設計師。

1.5 複用具體實現

組合(composition)。
實際上,在建立新類時,應該首先考慮組合,因為它更加簡單靈活。

1.6 繼承

源類(被稱為基類超類父類),副本(被稱為匯出類繼承類子類
有兩種方法可以使基類與匯出類產生差異。第一種方法非常直接:直接在匯出類中新增新方法。
第二種也是更重要的一種使匯出類和基類之間產生差異的方法是改變現有基類的方法的行為,這被稱之為覆蓋(overriding)。

1.7 伴隨多型的可互換物件

在處理型別的層次結構時,經常想把一個物件不當作它所屬的特定型別來對待,而是將其當作其基類的物件來對待。這使得人們可以編寫出不依賴與特定型別的程式碼。在“幾何形”的例子中,方法操作的都是泛化(generic)的形狀,而不關心它們是圓形、正方形、三角形還是其他的什麼尚未定義的形狀。所有的幾何形狀都可以被繪製、擦除和移動,所以這些方法都是直接對一個幾何形物件傳送訊息;它們不用擔心物件將如何處理訊息。
在這裡插入圖片描述
在下面的圖中,BirdController物件僅僅處理泛化的Bird物件,而不瞭解它們的確切型別。從BirdController的角度看,這麼做非常方便,因為不需要編寫特別的程式碼來判定要處理的Bird物件的確切型別或其行為。當move()方法被呼叫時,即便忽略Bird的具體型別,也會產生正確的行為(Goose(鵝)走、飛或游泳 ,Penguin(企鵝)走或游泳)),那麼,這是如何發生的呢?
在這裡插入圖片描述
為了解決這個問題,面向物件程式設計語言使用了後期繫結的概念。當向物件傳送訊息時,被呼叫的程式碼直到執行時才能確定。編譯器確保被呼叫方法的存在,並對呼叫引數和返回值執行型別檢查,但是並不知道將被執行的確切程式碼。
把將匯出類看做是它的基類的過程稱為向上轉型(upcasting)。
在這裡插入圖片描述

1.8 單根繼承結構

所有的類都繼承自單一的基類。

後面待補。。。