天天看點

《Java 7程式設計入門經典》一1.5 面向對象程式設計的關鍵特性

java的核心在于面向對象程式設計(object-oriented programming,oop)。面向對象的方法學是java不可或缺的一部分。所有的java程式或多或少都是面向對象的。因為面向對象對java如此重要,甚至在寫一個簡單的java程式前了解面向對象的基本原則都是有用的。

面向對象是解決程式設計工作的一個強有力的方法。自從計算機發明以來,程式設計方法學有着很大的變化,這些變化主要是為了适應不斷增長的程式設計複雜度。例如,在計算機剛發明時,程式設計是通過計算機的前面闆(front panel)以二進制機器指令的方式輸入的。由于程式隻有幾百個指令,這種方法還可行。随着程式長度的增加,彙編語言應運而生。程式員可以使用機器指令的符号表示,來處理更大的、更複雜的程式。第一種廣泛流行的語言是fortran。經過這是非常引人注目的一步,但是大型的fortran程式還是相當難以了解。

20世紀90年代,結構化程式設計誕生了。這是c和pascal推崇的方法。結構化語言的使用使得編寫适當複雜的程式變得相當容易。結構化語言的特點有:獨立的子例程、局部變量、豐富的控制結構、不依賴于goto語句。盡管結構化語言是一個強有力的工具,它們也會遇到瓶頸。

不妨這麼考慮:在程式設計發展的各個關鍵節點,技術和工具的發明使得程式員能夠處理更大的複雜度。在語言演進的道路上,新的方法都攫取前人的最好元素,并再向前改良。在面向對象程式設計發明之前,許多項目都幾乎接近(甚至已經)崩潰。面向對象的方法能夠幫助程式員克服這些障礙。

面向對象程式設計汲取了結構化程式設計中最優秀的思想,将其與一些新的概念結合。這産生了一種組織程式的不同方法。一般認為,程式可以用以下兩種方法中的一種進行組織:圍繞代碼(即發生的動作)進行組織,或圍繞資料(即受影響的内容)進行組織。若隻用結構化程式設計技術,程式一般圍繞代碼組織。這種方法可以認為是“代碼操作資料”的思想。

面向對象程式設計使用另一種方法。它圍繞資料進行組織,它的關鍵原則是:資料控制代碼的通路權限。在面向對象語言中,可以定義資料和運作操作資料的子例程。于是,資料類型精确定義了什麼類型的操作可以應用于這個資料。

為了支援面向對象程式設計的原則,所有面向對象的語言(包括java)有三種特性:封裝、多态和繼承。讓我們對此逐一考查。

封裝(encapsulation)是一種程式設計技術,它将代碼與其操作的資料綁定起來,使它們在有外界的幹擾和誤用的情況下保持安全。在面向對象語言中,代碼和資料可以以一種自包含的黑盒(black box)的方式綁定。在這個黑盒内,有所有必需的資料和代碼。當代碼和資料以這種方式聯系起來時,對象就誕生了。換句話說,對象是支援封裝的裝置。

在對象内部,對對象而言,代碼、資料或兩者都有可能是私有的(private)或公有的(public)。隻有對象其他部分才能解和通路私有代碼和資料。也就是說,對象外部存在的程式片段不能通路私有代碼和資料。當代碼或資料是公有的時,即使它們定義在對象内部,程式的其他部分能夠通路到它們。一般情況下,對象的公有部分用來提供針對對象私有元素的控制接口。

java封裝的基本單元是類(class)。盡管在本書後文将對類進行詳細介紹,但在此進行一些簡單介紹也是有益的。類定義了對象的形式。它指定了資料和操作資料的代碼。java使用類的描述來構造對象(object)。對象是類的執行個體(instance)。是以,類在本質上是一個規劃集合,這個集合指定建立對象的方式。

組成的代碼和資料稱為類的成員(member)。特别是,類中的資料稱為成員變量(member variable)或執行個體變量(instance variable)。操作資料的代碼稱為成員方法(member method),或簡稱方法(method)。

多态(polymorphism)這個詞起源于希臘語,是“多種形态”的意思。多态這個性質允許我們僅通過一個接口來通路一類動作。而具體執行哪些動作由當時具體的情形決定。汽車的方向盤就是多态的一個簡單例子。無論實際使用哪種方向盤,方向盤(也就是接口)都是一樣的。即,無論汽車采用手動操作還是電動操作的方向盤,方向盤都同樣工作。于是,一旦了解如何操作方向盤,就可以駕駛任意種類的汽車,而不用關心方向盤是如何實作的。

這個原則對程式設計也同樣适用。下面就舉一個簡單的例子。比如建立一個接口,它定義一個稱為get的操作,用從某種表單中獲得下一項資料。這種擷取下一項資料的動作,基于資料的存儲方式,可以有很多實作方式。例如,資料項可能是以先進先出的順序存儲的,也可能是以先進後出的順序存儲的,或是以某種優先級存儲的,還可能以許多其他方式存儲。但是,隻要某種存儲機制實作了這個接口,使用者就可以通過get方法來檢索下一資料項。

更一般地,多态的概念可以表述為“一個接口,多種方法”。這意味着,有可能為一組相關的活動設計一個通用的接口。多态通過允許為一般動作使用同一接口來降低複雜度。而編譯器會為每個應用場景選擇特定的動作(即方法)。程式員無須手動做出選擇,隻須使用通用接口即可。

繼承(inheritance)是一個對象從另一個對象擷取屬性的過程。由于它支援按層級結構分類的概念,是以它非常重要。實際上世間絕大部分知識都是以按層次結構(即自頂向下)的分類管理的。例如,紅富士蘋果是蘋果的一種,而蘋果又是水果的一種,而水果又是食物的一種。換句話說,食物的所有品質(如可食用性、有營養等)都适用于水果;水果還有其獨有的特征(如多汁、味甜等)。水果的獨有特征使其與其他食物分離開來。蘋果也定義了其獨有的品質(如長在樹上、非熱帶作物等)。依次地,紅富士蘋果也繼承了前述大類的品質,還定義了一些使其獨一無二的品質。

如果不使用繼承,每個對象就隻能顯式定義所有特點。使用繼承,對象隻需在類中定義使其獨一無二的品質。它能從其父類繼承一般特性。于是,繼承機制使得從一個更一般的情況來定義一個特别的執行個體對象成為可能。

《Java 7程式設計入門經典》一1.5 面向對象程式設計的關鍵特性