1. 程式人生 > >JAVA的面向物件程式設計詳解

JAVA的面向物件程式設計詳解

歷史

1967年挪威計算中心的Kisten Nygaard和Ole Johan Dahl開發了Simula67語言,它提供了比子程式更高一級的抽象和封裝,引入了資料抽象和類的概念,它被認為是第一個面嚮物件語言。

20世紀70年代初,Palo Alto研究中心的Alan Kay所在的研究小組開發出Smalltalk語言,之後又開發出Smalltalk-80,Smalltalk-80被認為是最純正的面嚮物件語言,它對後來出現的面嚮物件語言,如Object-C,C++,Self,Eiffl都產生了深遠的影響。

隨著面嚮物件語言的出現,面向物件程式設計也就應運而生且得到迅速發展。之後,面向物件不斷向其他階段滲透,1980年Grady Booch提出了面向物件設計的概念,之後面向物件分析開始。

1985年,第一個商用面向物件資料庫問世。1990年以來,面向物件分析、測試、度量和管理等研究都得到長足發展。

實際上,“物件”和“物件的屬性”這樣的概念可以追溯到20世紀50年代初,它們首先出現於關於人工智慧的早期著作中。但是出現了面嚮物件語言之後,面向物件思想才得到了迅速的發展。

過去的幾十年中,程式設計語言對抽象機制的支援程度不斷提高:從機器語言到組合語言,到高階語言,直到面嚮物件語言。組合語言出現後,程式設計師就避免了直接使用0-1,而是利用符號來表示機器指令,從而更方便地編寫程式;當程式規模繼續增長的時候,出現了Fortran、C、Pascal等高階語言,這些高階語言使得編寫複雜的程式變得容易,程式設計師們可以更好地對付日益增加的複雜性。但是,如果軟體系統達到一定規模,即使應用結構化程式設計方法,局勢仍將變得不可控制。作為一種降低複雜性的工具,面嚮物件語言產生了,面向物件程式設計也隨之產生。

面向物件

程式設計中的概念主要包括:物件、類、資料抽象、繼承、動態繫結、資料封裝、多型性、訊息傳遞。通過這些概念面向物件的思想得到了具體的體現。

加粗樣式1)物件(Object) 可以對其做事情的一些東西。一個物件有狀態、行為和標識三種屬性。

2)類(class) 一個共享相同結構和行為的物件的集合。
類(Class)定義了一件事物的抽象特點。通常來說,類定義了事物的屬性和它可以做到的(它的行為)。舉例來說,“狗”這個類會包含狗的一切基礎特徵,例如它的孕育、毛皮顏色和吠叫的能力。類可以為程式提供模版和結構。一個類的方法和屬性被稱為“成員”。

3)封裝(encapsulation):

**第一層意思:**將資料和操作捆綁在一起,創造出一個新的型別的過程。

**第二層意思:**將介面與實現分離的過程。

4)繼承 類之間的關係,在這種關係中,一個類共享了一個或多個其他類定義的結構和行為。繼承描述了類之間的“是一種”關係。子類可以對基類的行為進行擴充套件、覆蓋、重定義。

5)組合 既是類之間的關係也是物件之間的關係。在這種關係中一個物件或者類包含了其他的物件和類。
組合描述了“有”關係。

6)多型 型別理論中的一個概念,一個名稱可以表示很多不同類的物件,這些類和一個共同超類有關。因此,這個名稱表示的任何物件可以以不同的方式響應一些共同的操作集合。

7)動態繫結 也稱動態型別,指的是一個物件或者表示式的型別直到執行時才確定。通常由編譯器插入特殊程式碼來實現。與之對立的是靜態型別。

8)靜態繫結 也稱靜態型別,指的是一個物件或者表示式的型別在編譯時確定。

9)訊息傳遞 指的是一個物件呼叫了另一個物件的方法(或者稱為成員函式)。

10)方法 也稱為成員函式,是指物件上的操作,作為類宣告的一部分來定義。方法定義了可以對一個物件執行那些操作。

語言分類

一種語言要稱為面嚮物件語言,必須支援面向物件幾個主要的概念。根據支援程度的不同,通常所說的面嚮物件語言可以分成兩類:基於物件的語言和麵向物件的語言。

基於物件的語言
基於物件的語言僅支援類和物件,舉例來說,Ada就是一個典型的基於物件的語言,因為它不支援繼承、多型,此外其他基於物件的語言還有Alphard、CLU、Euclid、Modula。

面向物件的語言
面向物件的語言支援的概念包括:類與物件、繼承、多型。
面向物件的語言中一部分是新發明的語言,如Smalltalk、Java,這些語言本身往往吸取了其他語言的精華,而又儘量剔除他們的不足,因此面向物件的特徵特別明顯,充滿了蓬勃的生機;另外一些則是對現有的語言進行改造,增加面向物件的特徵演化而來的。

如由Pascal發展而來的Object Pascal,由C發展而來的Objective-C,C++,由Ada發展而來的Ada 95等,這些語言保留著對原有語言的相容,並不是純粹的面嚮物件語言,但由於其前身往往是有一定影響的語言,因此這些語言依然寶刀不老,在程式設計語言中佔有十分重要的地位。

設計優點

面向物件出現以前,結構化程式設計是程式設計的主流,結構化程式設計又稱為面向過程的程式設計。在面向過程程式設計中,問題被看作一系列需要完成的任務,函式(在此泛指例程、函式、過程)用於完成這些任務,解決問題的焦點集中於函式。其中函式是面向過程的,即它關注如何根據規定的條件完成指定的任務。

在多函式程式中,許多重要的資料被放置在全域性資料區,這樣它們可以被所有的函式訪問。每個函式都可以具有它們自己的區域性資料。

這種結構很容易造成全域性資料在無意中被其他函式改動,因而程式的正確性不易保證。面向物件程式設計的出發點之一就是彌補面向過程程式設計中的一些缺點:物件是程式的基本元素,它將資料和操作緊密地連結在一起,並保護資料不會被外界的函式意外地改變。

比較面向物件程式設計和麵向過程程式設計,還可以得到面向物件程式設計的其他優點:

1)資料抽象的概念可以在保持外部介面不變的情況下改變內部實現,從而減少甚至避免對外界的干擾;

2)通過繼承大幅減少冗餘的程式碼,並可以方便地擴充套件現有程式碼,提高編碼效率,也減低了出錯概率,降低軟體維護的難度;

3)結合面向物件分析、面向物件設計,允許將問題域中的物件直接對映到程式中,減少軟體開發過程中中間環節的轉換過程;

4)通過對物件的辨別、劃分可以將軟體系統分割為若干相對為獨立的部分,在一定程度上更便於控制軟體複雜度;

5)以物件為中心的設計可以幫助開發人員從靜態(屬性)和動態(方法)兩個方面把握問題,從而更好地實現系統;

6)通過物件的聚合、聯合可以在保證封裝與抽象的原則下實現物件在內在結構以及外在功能上的擴充,從而實現物件由低到高的升級。

特點

面向物件設計方法以物件為基礎,利用特定的軟體工具直接完成從物件客體的描述到軟體結構之間的轉換。這是面向物件設計方法最主要的特點和成就。

面向物件設計方法的應用解決了傳統結構化開發方法中客觀世界描述工具與軟體結構的不一致性問題,縮短了開發週期,解決了從分析和設計到軟體模組結構之間多次轉換對映的繁雜過程,是一種很有發展前途的系統開發方法。

但是同原型方法一樣, 面向物件設計方法需要一定的軟體基礎支援才可以應用,另外在大型的MIS開發中如果不經自頂向下的整體劃分,而是一開始就自底向上的採用面向物件設計方法開發系統,同樣也會造成系統結構不合理、各部分關係失調等問題。所以面向物件設計方法和結構化方法仍是兩種在系統開發領域相互依存的、不可替代的方法。

方法

在資料輸入模組內部設計中,採用面向物件的設計方法。

[6]面向物件的基本概念如下:
物件:物件是要研究的任何事物。從一本書到一家圖書館,單的整數到整數列龐大的資料庫、極其複雜的自動化工廠、太空梭都可看作物件,它不僅能表示有形的實體,也能表示無形的(抽象的)規則、計劃或事件。物件由資料(描述事物的屬性)和作用於資料的操作(體現事物的行為)構成一獨立整體。

從程式設計者來看,物件是一個程式模組,從使用者來看,物件為他們提供所希望的行為。在對內的操作通常稱為方法。

類:類是物件的模板。即類是對一組有相同屬性和相同操作的物件的定義,一個類所包含的方法和資料描述一組物件的共同屬性和行為。類是在物件之上的抽象,物件則是類的具體化,是類的例項。類可有其子類,也可有其它類,形成類層次結構。

訊息:訊息是物件之間進行通訊的一種規格說明。一般它由三部分組成:接收訊息的物件、訊息名及實際變元。
面向物件主要特徵:

封裝性:封裝是一種資訊隱蔽技術,它體現於類的說明,是物件的重要特性。封裝使資料和加工該資料的方法(函式)封裝為一個整體,以實現獨立性很強的模組,使得使用者只能見到物件的外特性(物件能接受哪些訊息,具有那些處理能力),而物件的內特性(儲存內部狀態的私有資料和實現加工能力的演算法)對使用者是隱蔽的。封裝的目的在於把物件的設計者和物件的使用者分開,使用者不必知曉行為實現的細節,只須用設計者提供的訊息來訪問該物件。

繼承性:繼承性是子類自動共享父類之間資料和方法的機制。它由類的派生功能體現。一個類直接繼承其它類的全部描述,同時可修改和擴充。繼承具有傳遞性。繼承分為單繼承(一個子類只有一父類)和多重繼承(一個類有多個父類)。類的物件是各自封閉的,如果沒繼承性機制,則類物件中資料、方法就會出現大量重複。繼承不僅支援系統的可重用性,而且還促進系統的可擴充性。

多型性:物件根據所接收的訊息而做出動作。同一訊息為不同的物件接受時可產生完全不同的行動,這種現象稱為多型性。利用多型性使用者可傳送一個通用的資訊,而將所有的實現細節都留給接受訊息的物件自行決定,如是,同一訊息即可呼叫不同的方法。

例如:Print訊息被髮送給一圖或表時呼叫的列印方法與將同樣的Print訊息傳送給一正文檔案而呼叫的列印方法會完全不同。多型性的實現受到繼承性的支援,利用類繼承的層次關係,把具有通用功能的協議存放在類層次中儘可能高的地方,而將實現這一功能的不同方法置於較低層次,這樣,在這些低層次上生成的物件就能給通用訊息以不同的響應。在OOPL中可通過在派生類中重定義基類函式(定義為過載函式或虛擬函式)來實現多型性。

綜上可知,在面對物件方法中,物件和傳遞訊息分別表現事物及事物間相互聯絡的概念。類和繼承是是適應人們一般思維方式的描述正規化。方法是允許作用於該類物件上的各種操作。

這種物件、類、訊息和方法的程式設計正規化的基本點在於物件的封裝性和類的繼承性。通過封裝能將物件的定義和物件的實現分開,通過繼承能體現類與類之間的關係,以及由此帶來的動態聯編和實體的多型性,從而構成了面向物件的基本特徵。

面向物件設計是一種把面向物件的思想應用於軟體開發過程中,指導開發活動的系統方法,是建立在“物件”概念基礎上的方法學。物件是由資料和容許的操作組成的封裝體,與客觀實體有直接對應關係,一個物件類定義了具有相似性質的一組物件。而每繼承性是對具有層次關係的類的屬性和操作進行共享的一種方式。所謂面向物件就是基於物件概念,以物件為中心,以類和繼承為構造機制,來認識、理解、刻畫客觀世界和設計、構建相應的軟體系統。

按照Bjarne STroustRUP的說法,面向物件的程式設計正規化:

決定你要的類;
給每個類提供完整的一組操作;
明確地使用繼承來表現共同點。

由這個定義,我們可以看出:面向物件設計就是“根據需求決定所需的類、類的操作以及類之間關聯的過程”。

應用

電腦科學中物件和例項概念的最早萌芽可以追溯到麻省理工學院的PDP-1系統。這一系統大概是最早的基於容量架構(capability based architecture)的實際系統。另外1963年Ivan Sutherland的Sketchpad應用中也蘊含了同樣的思想。物件作為程式設計實體最早是於1960年代由Simula 67語言引入思維。

Simula這一語言是奧利-約翰·達爾和克利斯登·奈加特在挪威奧斯陸計算機中心為模擬環境而設計的。(據說,他們是為了模擬船隻而設計的這種語言,並且對不同船隻間屬性的相互影響感興趣。他們將不同的船隻歸納為不同的類,而每一個物件,基於它的類,可以定義它自己的屬性和行為。)這種辦法是分析式程式的最早概念體現。在分析式程式中,我們將真實世界的物件對映到抽象的物件,叫做“模擬”。

Simula不僅引入了“類”的概念,還應用了例項這一思想——這可能是這些概念的最早應用。

20世紀70年代施樂PARC研究所發明的Smalltalk語言將面向物件程式設計的概念定義為,在基礎運算中,對物件和訊息的廣泛應用。Smalltalk的建立者深受Simula 67的主要思想影響,但Smalltalk中的物件是完全動態的——它們可以被建立、修改並銷燬,這與Simula中的靜態物件有所區別。此外,Smalltalk還引入了繼承性的思想,它因此一舉超越了不可建立例項的程式設計模型和不具備繼承性的Simula。

此外,Simula 67的思想亦被應用在許多不同的語言,如Lisp、Pascal。

面向物件程式設計在80年代成為了一種主導思想,這主要應歸功於C++——C語言的擴充版。在圖形使用者介面(GUI)日漸崛起的情況下,面向物件程式設計很好地適應了潮流。GUI和麵向物件程式設計的緊密關聯在Mac OS X中可見一斑。Mac OS X是由Objective-C語言寫成的,這一語言是一個仿Smalltalk的C語言擴充版。

面向物件程式設計的思想也使事件處理式的程式設計更加廣泛被應用(雖然這一概念並非僅存在於面向物件程式設計)。一種說法是,GUI的引入極大地推動了面向物件程式設計的發展。

蘇黎世聯邦理工學院的尼克勞斯·維爾特和他的同事們對抽象資料和模組化程式設計進行了研究。Modula-2將這些都包括了進去,而Oberon則包括了一種特殊的面向物件方法——不同於Smalltalk與C++。

面向物件的特性也被加入了當時較為流行的語言:Ada、BASIC、Lisp、Fortran、Pascal以及種種。由於這些語言最初並沒有面向物件的設計,故而這種糅合常常會導致相容性和維護性的問題。

與之相反的是,“純正的”面嚮物件語言卻缺乏一些程式設計師們賴以生存的特性。在這一大環境下,開發新的語言成為了當務之急。作為先行者,Eiffel成功地解決了這些問題,併成為了當時較受歡迎的語言。

在過去的幾年中,Java語言成為了廣為應用的語言,除了它與C和C++語法上的近似性。Java的可移植性是它的成功中不可磨滅的一步,因為這一特性,已吸引了龐大的程式設計師群的投入。

一些既支援面向物件程式設計,又支援面向過程程式設計的語言悄然浮出水面。它們中的佼佼者有Python、Ruby等等。

正如面向過程程式設計使得結構化程式設計的技術得以提升,現代的面向物件程式設計方法使得對設計模式的用途、契約式設計和建模語言(如UML)技術也得到了一定提升。

想了解更多技術知識,
歡迎加q:2834267066交流