天天看點

從零開始學習Java程式設計--了解面向對象程式設計

Java語言是純粹的面向對象的程式設計語言,這主要表現為Java完全支援面向對象的三種基本特征:繼承、封裝和多态。Java語言完全以對象為中心,Java程式的最小程式機關是類,整個Java程式由一個一個的類組成。

Java完全支援使用對象、類、繼承、封裝、消息等基本概念來進行程式設計,允許從現實世界中客觀存在的事物(即對象)出發來構造軟體系統,在系統構造中盡可能運用人類的自然思維方式。實際上,這些優勢是所有面向對象程式設計語言的共同特征。而面向對象的方式實際上由OOA(面向對象分析)、OOD(面向對象設計)和OOP(面向對象程式設計)三個部分有機組成,其中,OOA和OOD的結構需要使用一種方式來描述并記錄,目前業界統一采用UML(統一模組化語言)來描述并記錄OOA和OOD的結果。目前UML的最新版是2.0它一共包括13種類型的圖形,使用這13種圖形中的某些就可以很好地描述并記錄軟體分析、設計的結果。

1、面向對象程式設計簡介

    面向對象的基本思想是使用類、對象、繼承、封裝、消息等基本概念來進行程式設計。

    采用面向對象方式開發的軟體系統,其最小的程式單元是類,這些類可以生成系統中的多個對象,而這些對象則直接映像成客觀世界的各種事物。采用面向對象方式開發的軟體系統邏輯上的組成結構。如圖所示:

從零開始學習Java程式設計--了解面向對象程式設計

從圖上可以看出,面向對象的軟體系統由多個類組成,類代表了客觀世界上具有某種特征的一類事物往往有一些内部的狀态資料,比如人有身高、體重、年齡、愛好等各種狀态資料--當然程式沒有必要記錄該事物所有的狀态資料,程式隻要記錄業務關心的狀态資料即可。

面向對象的語言不僅使用類來封裝一類事物的内部狀态資料,這種狀态資料就對應于圖中的Field;而且類會提供操作這些狀态資料的方法,還會為這類事物的行為特征提供相應的實作,這種實作也是方法。是以:可以得到如下基本等式:

                                                                        Field(狀态資料)+方法(行為)=類定義

  從這個等式來看,面向對象比面向過程的程式設計粒度要大;面向對象的程式機關是類;而面向過程的程式機關是函數(相當于方法)是以面向對象比面向過程更簡單、易用。我們舉個例子來說,希望完成“豬八戒吃西瓜”這樣一件事情。

                         面向過程的思維:吃(豬八戒,西瓜);     面向對象的思維:豬八戒.吃(西瓜);

2、UML(統一模組化語言)介紹

   面向對象軟體開發需要經過OOA(面向對象分析)、OOD(面向對象設計)和OOP(面向對象程式設計)三個階段,OOA對目标系統進行分析,建立分析模型,并将之文檔化;OOD用面向對象的思想對OOA的結果進行細化,得出設計模型。OOA和OOD的分析、設計結果需要統一的符号來描述、交流并記錄,UML就是這種用于描述、記錄OOA和OOD結果的符号表示法。UML2.0分為靜态圖和動态圖兩種。如下圖所示:

從零開始學習Java程式設計--了解面向對象程式設計

   平時最常用的UML圖包括用例圖、類圖、元件圖、部署圖、順序圖、活動圖和狀态機圖等。

   以下圖示轉載于IBM網站:http://www.ibm.com/developerworks/cn/rational/r-uml/

    (1)用例圖

          用例圖描述了系統提供的一個功能單元。用例圖的主要目的是幫助開發團隊以一種可視化的方式了解系統的功能需求,包括基于基本流程的"角色"(actors,也就是與系統互動的其他實體)關系,以及系統内用例之間的關系。用例圖一般表示出用例的組織關系--要麼是整個系統的全部用例,要麼是完成具有功能(例如,所有安全管理相關的用例)的一組用例。要在用例圖上顯示某個用例,可繪制一個橢圓,然後将用例的名稱放在橢圓的中心或橢圓下面的中間位置。要在用例圖上繪制一個角色(表示一個系統使用者),可繪制一個人形符号。角色和用例之間的關系使用簡單的線段來描述,如圖所示

從零開始學習Java程式設計--了解面向對象程式設計

圖字(從上到下):CD銷售系統;檢視樂隊CD的銷售統計;樂隊經理;檢視Billboard 200排行榜報告;唱片經理;檢視特定CD的銷售統計;檢索最新的Billboard 200排行榜報告;排行榜報告服務

用例圖通常用于表達系統或者系統範疇的進階功能。如圖所示,可以很容易看出該系統所提供的功能。這個系統允許樂隊經理檢視樂隊CD的銷售統計報告以及Billboard 200排行榜報告。它也允許唱片經理檢視特定CD的銷售統計報告和這些CD在Billboard 200排行榜的報告。這個圖還告訴我們,系統将通過一個名為"排行榜報告服務"的外部系統提供Billboard排行榜報告。

此外,在用例圖中,沒有列出的用例表明了該系統不能完成的功能。例如,它不能提供給樂隊經理收聽Billboard 200上不同專輯中的歌曲的途徑 -- 也就是說,系統沒有引用一個叫做"收聽Billboard 200上的歌曲"的用例。這種缺少不是一件小事。在用例圖中提供清楚的、簡要的用例描述,項目贊助商就很容易看出系統是否提供了必須的功能。

    (2)類圖

類圖表示不同的實體(人、事物和資料)如何彼此相關;換句話說,它顯示了系統的靜态結構。類圖可用于表示邏輯類,邏輯類通常就是業務人員所談及的事物種類--搖滾樂隊、CD、廣播劇;或者貸款、住房抵押、汽車信貸以及利率。類圖還可用于表示實作類,實作類就是程式員處理的實體。實作類圖或許會與邏輯類圖顯示一些相同的類。然而,實作類圖不會使用相同的屬性來描述,因為它很可能具有對諸如Vector和HashMap這種事物的引用。

類在類圖上使用包含三個部分的矩形來描述,如圖所示。最上面的部分顯示類的名稱,中間部分包含類的屬性,最下面的部分包含類的操作(或者說"方法")。

從零開始學習Java程式設計--了解面向對象程式設計

幾乎每個開發人員都知道這個類圖是什麼,但是我發現大多數程式員都不能正确地描述類的關系。對于像下圖這樣的類圖,您應該使用帶有頂點指向父類的箭頭的線段來繪制繼承關系1,并且箭頭應該是一個完全的三角形。如果兩個類都彼此知道對方,則應該使用實線來表示關聯關系;如果隻有其中一個類知道該關聯關系,則使用開箭頭表示。

從零開始學習Java程式設計--了解面向對象程式設計

   在圖中,我們同時看到了繼承關系和兩個關聯關系。CDSalesReport類繼承自Report類。一個CDSalesReport類與一個CD類關聯,但是CD類并不知道關于CDSalesReport類的任何資訊。CD類和Band類都彼此知道對方,兩個類彼此都可以與一個或者多個對方類相關聯。

    (3)元件圖

元件圖提供系統的實體視圖。它的用途是顯示系統中的軟體對其他軟體元件(例如,庫函數)的依賴關系。元件圖可以在一個非常高的層次上顯示,進而僅顯示粗粒度的元件,也可以在元件包層次2上顯示。

元件圖的模組化最适合通過例子來描述。圖顯示了4個元件:Reporting Tool、Billboard Service、Servlet 2.2 API和JDBC API。從Reporting Tool元件指向Billboard Service、Servlet 2.2 API和JDBC API元件的帶箭頭的線段,表示Reporting Tool依賴于那三個元件。

從零開始學習Java程式設計--了解面向對象程式設計

    (4)部署圖

部署圖表示該軟體系統如何部署到硬體環境中。它的用途是顯示該系統不同的元件将在何處實體地運作,以及它們将如何彼此通信。因為部署圖是對實體運作情況進行模組化,系統的生産人員就可以很好地利用這種圖。

部署圖中的符号包括元件圖中所使用的符号元素,另外還增加了幾個符号,包括節點的概念。一個節點可以代表一台實體機器,或代表一個虛拟機器節點(例如,一個大型機節點)。要對節點進行模組化,隻需繪制一個三維立方體,節點的名稱位于立方體的頂部。所使用的命名約定與序列圖中相同:[執行個體名稱] : [執行個體類型](例如,"w3reporting.myco.com : Application Server")。

從零開始學習Java程式設計--了解面向對象程式設計

部署圖。由于Reporting Tool元件繪制在IBM WebSphere内部,後者又繪制在節點w3.reporting.myco.com内部,因而我們知道,使用者将通過運作在本地機器上的浏覽器來通路Reporting Tool,浏覽器通過公司intranet上的HTTP協定與Reporting Tool建立連接配接。

圖中的部署圖表明,使用者使用運作在本地機器上的浏覽器通路Reporting Tool,并通過公司intranet上的HTTP協定連接配接到Reporting Tool元件。這個工具實際運作在名為w3reporting.myco.com的Application Server上。這個圖還表明Reporting Tool元件繪制在IBM WebSphere内部,後者又繪制在w3.reporting.myco.com節點内部。Reporting Tool使用Java語言通過IBM DB2資料庫的JDBC接口連接配接到它的報告資料庫上,然後該接口又使用本地DB2通信方式,與運作在名為db1.myco.com的伺服器上實際的DB2資料庫通信。除了與報告資料庫通信外,Report Tool元件還通過HTTPS上的SOAP與Billboard Service進行通信。

    (5)順序圖

序列圖顯示具體用例(或者是用例的一部分)的詳細流程。它幾乎是自描述的,并且顯示了流程中中不同對象之間的調用關系,同時還可以很詳細地顯示對不同對象的不同調用。

序列圖有兩個次元:垂直次元以發生的時間順序顯示消息/調用的序列;水準次元顯示消息被發送到的對象執行個體。

序列圖的繪制非常簡單。橫跨圖的頂部,每個框(參見圖4)表示每個類的執行個體(對象)。在框中,類執行個體名稱和類名稱之間用空格/冒号/空格來分隔,例如,myReportGenerator : ReportGenerator。如果某個類執行個體向另一個類執行個體發送一條消息,則繪制一條具有指向接收類執行個體的開箭頭的連線,并把消息/方法的名稱放在連線上面。對于某些特别重要的消息,您可以繪制一條具有指向發起類執行個體的開箭頭的虛線,将傳回值标注在虛線上。就我而言,我總喜歡繪制出包括傳回值的虛線,這些額外的資訊可以使得序列圖更易于閱讀。

閱讀序列圖也非常簡單。從左上角啟動序列的"驅動"類執行個體開始,然後順着每條消息往下閱讀。記住:雖然圖4所示的例子序列圖顯示了每條被發送消息的傳回消息,但這隻是可選的。

從零開始學習Java程式設計--了解面向對象程式設計

圖4:一個示例序列圖

通過閱讀圖4中的示例序列圖,您可以明白如何建立一個CD銷售報告(CD Sales Report)。其中的aServlet對象表示驅動類執行個體。aServlet向名為gen的ReportGenerator類執行個體發送一條消息。該消息被标為generateCDSalesReport,表示ReportGenerator對象實作了這個消息處理程式。進一步了解可發現,generateCDSalesReport消息标簽在括号中包括了一個cdId,表明aServlet随該消息傳遞一個名為cdId的參數。當gen執行個體接收到一條generateCDSalesReport消息時,它會接着調用CDSalesReport類,并傳回一個aCDReport的執行個體。然後gen執行個體對傳回的aCDReport執行個體進行調用,在每次消息調用時向它傳遞參數。在該序列的結尾,gen執行個體向它的調用者aServlet傳回一個aCDReport。

請注意:圖4中的序列圖相對于典型的序列圖來說太詳細了。然而,我認為它才是足夠易于了解的,并且它顯示了如何表示嵌套的調用。對于初級開發人員來說,有時把一個序列分解到這種詳細程度是很有必要的,這有助于他們了解相關的内容。

    (6)活動圖

活動圖表示在處理某個活動時,兩個或者更多類對象之間的過程控制流。活動圖可用于在業務單元的級别上對更進階别的業務過程進行模組化,或者對低級别的内部類操作進行模組化。根據我的經驗,活動圖最适合用于對較進階别的過程模組化,比如公司目前在如何運作業務,或者業務如何運作等。這是因為與序列圖相比,活動圖在表示上"不夠技術性的",但有業務頭腦的人們往往能夠更快速地了解它們。

活動圖的符号集與狀态圖中使用的符号集類似。像狀态圖一樣,活動圖也從一個連接配接到初始活動的實心圓開始。活動是通過一個圓角矩形(活動的名稱包含在其内)來表示的。活動可以通過轉換線段連接配接到其他活動,或者連接配接到判斷點,這些判斷點連接配接到由判斷點的條件所保護的不同活動。結束過程的活動連接配接到一個終止點(就像在狀态圖中一樣)。作為一種選擇,活動可以分組為泳道(swimlane),泳道用于表示實際執行活動的對象,如圖6所示。

從零開始學習Java程式設計--了解面向對象程式設計

圖6:活動圖,具有兩個泳道,表示兩個對象的活動控制:樂隊經理,以及報告工具

圖字(沿箭頭方向):樂隊經理;報告工具;選擇"檢視樂隊的銷售報告";檢索該樂隊經理所管理的樂隊;顯示報告條件選擇螢幕;選擇要檢視其銷售報告的樂隊;從銷售資料庫檢索銷售資料;顯示銷售報告。

該活動圖中有兩個泳道,因為有兩個對象控制着各自的活動:樂隊經理和報告工具。整個過程首先從樂隊經理選擇檢視他的樂隊銷售報告開始。然後報告工具檢索并顯示他管理的所有樂隊,并要求他從中選擇一個樂隊。在樂隊經理選擇一個樂隊之後,報告工具就檢索銷售資訊并顯示銷售報告。該活動圖表明,顯示報告是整個過程中的最後一步。

以上圖轉載于IBM公司網站:http://www.ibm.com/developerworks/cn/rational/r-uml/

3、Java的面向對象特征

    面向對象方法具有三個基本特征:封裝(Encapsulation)、繼承(Inheritance)和多态(Polymorphism),其中封裝指的是将對象的實作細節隐藏起來,然後通過一些公用方法來暴露該對象的功能;繼承是面向對象實作軟體複用的重要手段,當子類繼承父類後,子類作為一種特殊的父類,将直接獲得父類的屬性和方法;多态指是的子類對象可以直接賦給父類變量,但運作時依然表現出子類的行為特征,

    面向對象還支援如下幾個功能:

     1)對象是面向對象方法中最基本的概念,它的基本特點是:辨別唯一性、分類性、多态性、封裝性、子產品獨立性好。

     2)類是具有共同屬性、共同方法的一類事物。類是對象的抽象;對象則是類的執行個體。而類是整個軟體系統最小的程式單元,類的封裝性将各種資訊細節隐藏起來,并通過公用方法來暴露該類對所提供的功能,進而提高了類的内聚性,降低了對象之間的耦合性。

     3)對象間的這種互相合作需要一個機制協助進行,這樣的機制稱為“消息”。消息是一個執行個體與另一個執行個體之間互相通信的機制。

     4)在面向對象方法中,類之間共享屬性和操作的機制稱為繼承。繼承具有傳遞性。繼承可分為單繼承(一個繼承隻允許有一個直接父類,即類等級為樹形結構)與多繼承(一個類允許有多個直接父類),但Java不支援多繼承。

在Java語言中除了8個基本資料類型值之外,一切都是對象,而對象就是面向對象程式設計的中心。對象具有狀态,一個對象用資料值來描述它的狀态。Java通過對對象定義Field(以前常被稱為屬性,現在也稱字段)來描述對象的狀态;對象還有操作,這些操作可以改變對象的狀态,對象的操作也被稱為對象的行為,Java通過為對象定義方法來描述對象的行為。

       對象是Java程式的核心,是以在Java裡的對象具有唯一性,每個對象都有一個辨別來引用它,如果某個對象失去了辨別,這個對象将變成垃圾,隻能等着系統垃圾回收機制來回收它。Java語言不允許直接通路對象,而是通過對對象的引用來操作對象。

在Java語言使用class關鍵字定義類,定義類時可使用Field來描述該類對象的資料,可使用方法來描述該類對象的行為特征。Java語言使用extends關鍵字來表示繼承關系。

Java使用new關鍵字來建立指定類的對象,每個類可以建立任意多個對象,多個對象的Field值可以不同。