




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
5.1面向?qū)ο蟪绦蛟O(shè)計(jì)的思想
5.2類和對象
5.3類和封裝
5.4類和繼承
5.5類和多態(tài)
5.6接口
5.7包
5.8面向?qū)ο笤O(shè)計(jì)原則5.1面向?qū)ο蟪绦蛟O(shè)計(jì)的思想軟件開發(fā)的主要目的是建立軟件系統(tǒng),這些軟件系統(tǒng)能為人們服務(wù)并增強(qiáng)人們在現(xiàn)實(shí)世界中解決問題的能力。一個(gè)軟件系統(tǒng)一般由兩部分組成:一個(gè)是模型,另一個(gè)是算法。前者代表現(xiàn)實(shí)世界中的相關(guān)部分;后者包含操作和處理模型所涉及的計(jì)算。面向?qū)ο蟮母拍钊鐖D5.1所示。面向?qū)ο蟮哪P痛砹塑浖到y(tǒng)在數(shù)據(jù)和計(jì)算方面的一個(gè)平衡的觀點(diǎn)。面向?qū)ο蟮哪P褪怯伞皩ο蟆睒?gòu)成的,對象本身包含了數(shù)據(jù)和相關(guān)的計(jì)算。復(fù)雜系統(tǒng)的分解基于對象和類結(jié)構(gòu)。面向?qū)ο蟮能浖_發(fā)方法與傳統(tǒng)的軟件開發(fā)方法有很大的差別,它從完全不同的角度看待現(xiàn)實(shí)世界并提取本質(zhì)的和相關(guān)的特征。5.1.1面向?qū)ο蟮姆椒▽W(xué)軟件開發(fā)面臨的挑戰(zhàn)就是尋求有效的解決方案,以控制軟件系統(tǒng)的復(fù)雜性、管理軟件系統(tǒng)的長效性和演變性,并交付具有更高可靠性和可用性的軟件系統(tǒng)。傳統(tǒng)的結(jié)構(gòu)設(shè)計(jì)技術(shù)雖然有許多優(yōu)點(diǎn),但也有比較明顯的缺點(diǎn):用這種技術(shù)開發(fā)出來的軟件,其穩(wěn)定性、可修改性和可重用性都比較差。面向?qū)ο蟮能浖_發(fā)方法學(xué)是當(dāng)前廣泛采用的解決方案,其目的是改善軟件系統(tǒng)的可靠性和軟件開發(fā)的成本效益。和傳統(tǒng)的、成熟的工程學(xué)科相比,軟件工程所采用的更像是工匠技術(shù)而不是工程技術(shù)。軟件開發(fā)者在很大程度上依賴于測試和調(diào)試(即嘗試和失敗),以建立他們對于自己產(chǎn)品的信心。軟件開發(fā)的成功很難通過對設(shè)計(jì)的分析得到保證。成熟的工程領(lǐng)域可以使成功的經(jīng)驗(yàn)和知識得以反復(fù)運(yùn)用,設(shè)計(jì)知識和解決方案往往被組織并編篡為指南或手冊,以使一般和常規(guī)的設(shè)計(jì)不僅更簡單、更快捷,而且更可靠、更可信和可管理。在軟件開發(fā)方面,盡管已經(jīng)積累了許多設(shè)計(jì)知識和經(jīng)驗(yàn),但很少被系統(tǒng)地編篡成冊,無法受益于以往的經(jīng)驗(yàn)和設(shè)計(jì)方案,每個(gè)軟件系統(tǒng)的設(shè)計(jì)都被當(dāng)成創(chuàng)新設(shè)計(jì)。為克服這個(gè)弊端,軟件開發(fā)的過程必須有一個(gè)機(jī)制,以完成設(shè)計(jì)分析、保證已知失敗不重復(fù)出現(xiàn)并將設(shè)計(jì)知識編篡成手冊。面向?qū)ο箝_發(fā)過程中的活動(dòng)與以前開發(fā)過程中的活動(dòng)有著完全不同的焦點(diǎn),同時(shí)也采用完全不同的技術(shù)、表示法、工具和確認(rèn)標(biāo)準(zhǔn)。面向?qū)ο箝_發(fā)過程的基本活動(dòng)一般包括:概念化、面向?qū)ο蠓治龊徒?、面向?qū)ο笤O(shè)計(jì)、實(shí)現(xiàn)和維護(hù)。其中,面向?qū)ο笤O(shè)計(jì)的目的是建立實(shí)現(xiàn)架構(gòu),設(shè)計(jì)用對象和類以及它們之間的關(guān)系來表達(dá)。面向?qū)ο笤O(shè)計(jì)主要關(guān)心以下幾個(gè)方面:(1)設(shè)計(jì)是否滿足了提到的所有需求和約束?是否足以提供所有期望的服務(wù)?(2)設(shè)計(jì)是否具有適應(yīng)未來變化的足夠的靈活性?(3)設(shè)計(jì)對實(shí)現(xiàn)來說是否可行?如果是,能否有效地實(shí)現(xiàn)?面向?qū)ο蟮能浖_發(fā)方法學(xué)特別適合迭代開發(fā),而迭代軟件開發(fā)過程已變得很流行,并在實(shí)踐中被人們所接受(迭代軟件開發(fā)過程的一個(gè)關(guān)鍵假設(shè)是認(rèn)為軟件開發(fā)的整個(gè)生命期中都將出現(xiàn)改動(dòng),軟件開發(fā)過程不是試圖阻止改動(dòng)或使改動(dòng)最小,而是試圖有效地管理和實(shí)現(xiàn)改動(dòng))。面向?qū)ο蟮能浖_發(fā)過程包含多個(gè)連續(xù)的迭代過程,每個(gè)迭代包括:確定類、確定類的語義(即屬性和行為)、確定類之間的關(guān)系、定義類接口、實(shí)現(xiàn)類。每個(gè)迭代只處理所開發(fā)系統(tǒng)相對小的增量。這樣,系統(tǒng)是以增量形式而非作為一個(gè)整體開發(fā)的,迭代過程持續(xù)到整個(gè)系統(tǒng)開發(fā)完成。5.1.2面向?qū)ο蟪绦蛟O(shè)計(jì)的基本概念面向?qū)ο蟪绦蛟O(shè)計(jì)的基本原則是:按照人們通常的思維方式建立問題的解空間,要求解空間盡可能自然地表現(xiàn)問題空間。為了實(shí)現(xiàn)這個(gè)原則,必須抽象出組成問題空間的主要事物,建立事物之間相互聯(lián)系的概念,還必須建立按人們一般思維方式進(jìn)行描述的準(zhǔn)則。在面向?qū)ο蟪绦蛟O(shè)計(jì)中,對象和消息傳遞分別表現(xiàn)事物以及事物之間的相互關(guān)系;類和繼承是按照人們一般思維方式的描述準(zhǔn)則;通過封裝能將對象的定義和對象的實(shí)現(xiàn)分開,通過繼承體現(xiàn)類和類之間的相互關(guān)系以及帶來的實(shí)體的多態(tài)性,從而構(gòu)成了面向?qū)ο蟮幕咎卣?。面向?qū)ο蟪绦蛟O(shè)計(jì)的基本概念有:類(Class)、對象(Object)、抽象(Abstract)、實(shí)例(Instance)、消息(Message)、方法(Method)、屬性(Attribute)、封裝(Encapsulation)、繼承(Inheritance)、重載(Overloading)和多態(tài)(Polymorphism)。1.對象(Object)對象是系統(tǒng)中用來描述客觀事物的一個(gè)實(shí)體,它是構(gòu)成系統(tǒng)的一個(gè)基本單位。一個(gè)對象由一組屬性(數(shù)據(jù))和對這組屬性進(jìn)行操作的一組服務(wù)(方法)組成。從更抽象的角度來說,對象是問題域或?qū)崿F(xiàn)域中某些事物的一個(gè)抽象,它反映該事物在系統(tǒng)中需要保存的信息和發(fā)揮的作用,它是一組屬性并有權(quán)對這些屬性進(jìn)行操作的一組服務(wù)的封裝體??陀^世界是由對象和對象之間的聯(lián)系組成的。主動(dòng)對象是一組屬性和一組服務(wù)的封裝體,其中至少有一個(gè)服務(wù)不需要接收消息就能主動(dòng)執(zhí)行(稱作主動(dòng)服務(wù))。2.類(Class)把眾多的事物歸納、劃分成一些類是人類在認(rèn)識客觀世界時(shí)經(jīng)常采用的思維方法。分類的原則是抽象。類是具有相同屬性和服務(wù)的一組對象的集合,它為屬于該類的所有對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和服務(wù)兩個(gè)主要部分。在面向?qū)ο蟮木幊陶Z言中,類是一個(gè)獨(dú)立的程序單位,它應(yīng)該有一個(gè)類名并包括屬性說明和服務(wù)說明兩個(gè)主要部分。類與對象的關(guān)系就如模具和鑄件的關(guān)系,類的實(shí)例化結(jié)果就是對象,而對具有相同屬性和方法的全部對象的抽象就是類。類的概念使我們能對屬于該類的全部對象進(jìn)行統(tǒng)一的描述,因此在定義對象之前應(yīng)先定義類。類實(shí)際上是對某種類型的對象定義變量和方法的原型。當(dāng)創(chuàng)建了一個(gè)類的實(shí)例后,系統(tǒng)將為這個(gè)對象和它的實(shí)例變量分配內(nèi)存。除了實(shí)例變量,類還要定義類的變量。類變量包含了類中所有實(shí)例共享的信息。比如,所有的汽車有相同的擋位數(shù),要定義一個(gè)實(shí)例變量來容納擋位數(shù)。每一個(gè)實(shí)例都會有變量的副本,但是在每一個(gè)實(shí)例中數(shù)值都是相同的。在這樣的情況下,可以定義一個(gè)類變量來包含擋位數(shù),這樣所有的類的實(shí)例都可以共享這個(gè)變量。如果一個(gè)對象改變了這個(gè)變量,就意味著改變了那個(gè)類的所有對象。類同樣可以定義類方法,即可以直接從類中調(diào)用類方法,然而必須在特定的實(shí)例中調(diào)用實(shí)例方法。3.消息(Message)消息就是向?qū)ο蟀l(fā)出的服務(wù)請求,它應(yīng)該包含:提供服務(wù)的對象標(biāo)識、服務(wù)標(biāo)識、輸入信息和回答信息。服務(wù)通常被稱為方法或函數(shù)。軟件對象之間利用消息進(jìn)行交互作用和通信。一個(gè)對象通常是一個(gè)包含了許多其他對象的更大的程序或者應(yīng)用程序。通過這些對象的交互作用,程序員可以獲得更多的功能以及更為復(fù)雜的行為。汽車如果不使用的時(shí)候,它就是一堆金屬和橡膠材料,沒有任何作用。而只有當(dāng)其他對象來和它交互的時(shí)候它才是有用的。軟件對象和其他對象進(jìn)行交互與通信是利用發(fā)送消息給其他對象來實(shí)現(xiàn)的。當(dāng)對象A希望對象B執(zhí)行一個(gè)B中的方法時(shí),對象A就會發(fā)送消息給對象B,對象交互如圖5.3所示。有時(shí)候,接收的對象需要更多的信息以使它可以準(zhǔn)確知道該如何做。如圖5.4所示的一個(gè)消息由三個(gè)組件組成:被消息尋址的對象、要執(zhí)行方法的名字和這個(gè)方法需要的所有參數(shù)。消息提供了兩個(gè)重要的好處:對象的行為是通過它的方法來表達(dá)的,因此消息傳遞支持所有對象之間的可能的交互;對象不需要在相同的進(jìn)程或者相同的機(jī)器上給其他對象發(fā)送和接收消息。4.封裝、繼承和多態(tài)封裝性、繼承性、多態(tài)性都是面向?qū)ο蟮幕咎卣鳌?1)封裝性。封裝性就是把對象的屬性和服務(wù)結(jié)合成一個(gè)獨(dú)立的相同單位,并盡可能隱蔽對象的內(nèi)部細(xì)節(jié),其包含兩個(gè)含義:把對象的全部屬性和全部服務(wù)結(jié)合在一起,形成一個(gè)不可分割的獨(dú)立單位(即對象)。信息隱蔽,即盡可能隱蔽對象的內(nèi)部細(xì)節(jié),對外形成一個(gè)邊界(或者說形成一道屏障),只保留有限的對外接口使之與外部發(fā)生聯(lián)系。封裝的原則在軟件上的反映是:要求對象以外的部分不能隨意存取對象的內(nèi)部數(shù)據(jù)(屬性),從而有效地避免了外部錯(cuò)誤對它的“交叉感染”,使軟件錯(cuò)誤能夠局部化,大大減少查錯(cuò)和排錯(cuò)的難度。(2)繼承性。特殊類的對象擁有其一般類的全部屬性與服務(wù),故稱作特殊類對一般類的繼承。一個(gè)類可以是多個(gè)一般類的特殊類,它從多個(gè)一般類中繼承了屬性與服務(wù),這稱為多繼承。例如,客輪是輪船和客運(yùn)工具的特殊類。在Java語言中,通常我們稱一般類為父類(Superclass,也稱超類),特殊類為子類(Subclass)。(3)多態(tài)性。對象的多態(tài)性是指在一般類中定義的屬性或服務(wù)被特殊類繼承之后,可以具有不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為。這使同一個(gè)屬性或服務(wù)在一般類及其各個(gè)特殊類中具有不同的語義。5.2類和對象5.2.1軟件對象軟件對象是一些相關(guān)的變量和方法的軟件集。軟件對象經(jīng)常用于模仿現(xiàn)實(shí)世界中我們身邊的一些對象。對象是理解面向?qū)ο蠹夹g(shù)的關(guān)鍵?,F(xiàn)實(shí)世界中的對象有兩個(gè)共同特征:狀態(tài)和行為。顧客和收銀員對象及其狀態(tài)如圖5.5所示。屬性是對象具有的各種特征,每個(gè)對象的每個(gè)屬性都擁有特定值。例如:張浩和李明的年齡、姓名不一樣。對象屬性如圖5.6所示。方法是對象執(zhí)行的操作,對象是用來描述客觀事物的一個(gè)實(shí)體,其由一組屬性和方法構(gòu)成。對象方法如圖5.7所示。5.2.2類聲明和類體類是Java中的一種重要的復(fù)合數(shù)據(jù)類型,是組成Java程序的基本要素。它封裝了一類對象的狀態(tài)和方法,是這一類對象的原型。一個(gè)類的實(shí)現(xiàn)包括兩個(gè)部分:類聲明和類實(shí)體。1.類聲明類聲明的代碼如圖5.8所示。2.類實(shí)體類實(shí)體跟在類聲明的后面,它是嵌入在大括號“{”和“}”中間的。類實(shí)體包含了所有實(shí)例變量和類變量的聲明。另外,類實(shí)體還包含了所有實(shí)例方法和類方法的聲明。Java類的模板如圖5.9所示。5.2.3如何創(chuàng)建和使用對象創(chuàng)建和使用對象的步驟如下:(1)創(chuàng)建對象。類名對象名=new類名();如:Schoolcenter=newSchool();(2)使用對象。引用對象成員:使用“.”進(jìn)行引用。引用類的屬性:對象名.屬性。引用類的方法:對象名.方法名()。5.2.4類的方法1.定義類的方法定義類的方法的運(yùn)行代碼如圖5.13所示。方法的返回值有兩種情況:如果方法具有返回值,方法中必須使用關(guān)鍵字return來返回該值,返回類型為該返回值的類型;如果方法中沒有返回值,則返回類型為void。2.方法調(diào)用方法是個(gè)“黑匣子”,可完成某個(gè)特定的應(yīng)用程序功能,并返回結(jié)果。方法調(diào)用就是:執(zhí)行方法中包含的語句。方法之間允許相互調(diào)用,調(diào)用時(shí),并不需要知道方法的具體實(shí)現(xiàn)。方法調(diào)用時(shí),常見的一些錯(cuò)誤如下:(1)方法的返回類型為void時(shí),方法中有return返回值,如圖5.15所示的運(yùn)行代碼。(2)方法返回了多個(gè)值,如圖5.16所示的運(yùn)行代碼。(3)多個(gè)方法相互嵌套定義,如圖5.17所示的運(yùn)行代碼。(4)在方法外部直接寫程序邏輯代碼,如圖5.18所示的運(yùn)行代碼。5.3類和封裝5.3.1封裝封裝(Encapsulation)也稱信息隱藏,將類的某些信息隱藏在類內(nèi)部,不允許外部程序直接訪問,而是通過該類提供的方法來實(shí)現(xiàn)對隱藏信息的操作和訪問。封裝的好處如圖5.19所示。類圖如圖5.20所示。使用類圖描述類,在分析和設(shè)計(jì)“類”時(shí),直觀,容易理解。封裝的具體步驟如圖5.21所示。類圖以及根據(jù)類圖生成的類、屬性及方法如圖5.22所示。5.3.2訪問控制Java語言中有四種不同的限定詞,提供了四種不同的訪問權(quán)限。(1)私有訪問控制。用private修飾的成員變量或成員方法,只能被該類自身訪問和修改,而不能被其他類(包括該類的子類)訪問和引用。它提供了最高的保護(hù)級別,即最低的訪問級別。如果一個(gè)類的構(gòu)造方法聲明為private,則其他類不能生成該類的一個(gè)實(shí)例。(2)缺省訪問控制,也稱為友好訪問控制(friendly)。類中不加任何訪問權(quán)限限定的成員屬于缺省的(default)訪問狀態(tài),可以被這個(gè)類本身和同一個(gè)包中的其他類所訪問,即具有包訪問性(即當(dāng)前目錄下可訪問)。同樣,一個(gè)類沒有訪問控制符限定,表明只有在同一個(gè)包中的對象才能訪問和引用這些類。(3)保護(hù)訪問控制。用protected修飾的成員,可以被這個(gè)類本身、它的子類(包括同一個(gè)包中以及不同包中的子類)和同一個(gè)包中的所有其他的類訪問。使用protected修飾符的主要作用是,允許其他包中它的子類來訪問該父類的特定屬性。(4)公共訪問控制。用public修飾的成員,可以被所有的類訪問。當(dāng)一個(gè)類被聲明為public時(shí),只要在其他包的程序中使用import語句并引入這個(gè)public類,就可以訪問和引用這個(gè)類,創(chuàng)建這個(gè)類的對象。public是最高的訪問級別,處于不同包中的public類作為整體對于其他類是可見的。但要注意,這不等于類中的所有成員對于其他類都是可見的,成員的可見性取決于成員的訪問控制修飾符。只有當(dāng)public類中的成員變量和成員方法的訪問控制也被修飾為public時(shí),這個(gè)類中的所有成員才能對于其他類是可見的。一般情況下,成員變量和成員方法的訪問控制被修飾為public,會造成安全性和封裝性下降,要謹(jǐn)慎使用。表5.1列出了這些限定詞的作用范圍。5.3.3構(gòu)造方法在創(chuàng)建對象時(shí),通常要為對象的數(shù)據(jù)成員賦初值,這被稱為對象的初始化。如果對象的數(shù)據(jù)成員比較多,那么初始化就會很麻煩,因?yàn)槊織l語句只能為一個(gè)數(shù)據(jù)成員賦初值,在這種情況下,就可以定義一個(gè)方法來實(shí)現(xiàn)對數(shù)據(jù)成員的賦值,這種方法被稱為構(gòu)造方法。類中可能包含一個(gè)或者多個(gè)構(gòu)造方法,這些方法可實(shí)現(xiàn)從類創(chuàng)建的對象的初始化。所有的Java類都有構(gòu)造函數(shù),它用來對新的對象進(jìn)行初始化。構(gòu)造函數(shù)與類的名字是相同的。下面給出Stack類的構(gòu)造函數(shù),其構(gòu)造方法的語法格式如圖5.23所示。創(chuàng)建構(gòu)造方法的運(yùn)行代碼如圖5.24所示。對象實(shí)例化時(shí),使用構(gòu)造方法的語法格式如圖5.25所示。5.3.4this的用法this關(guān)鍵字用于訪問本類的屬性和方法,this關(guān)鍵字的用法如下:(1)調(diào)用屬性如下:this.health=100;="大黃";(2)調(diào)用方法如下:this.print();(3)調(diào)用構(gòu)造方法如下:this();this("小黑",100,100,"雄");5.3.5靜態(tài)常量static可以用來修飾屬性、方法和代碼塊。static修飾的屬性和方法稱為類屬性(類變量)、類方法。不使用static修飾的屬性和方法,屬于單個(gè)對象,通常稱為實(shí)例屬性(實(shí)例變量)、實(shí)例方法。static修飾的變量和方法可以通過類名和對象名訪問,而不用static修飾的變量和方法只能通過對象名訪問。5.3.6final關(guān)鍵字final關(guān)鍵字可以修飾類、類的成員變量和成員方法,但其作用有所不同。1.?final修飾類的成員變量如果一個(gè)類的數(shù)據(jù)成員用final修飾,則這個(gè)數(shù)據(jù)成員就被限定為最終數(shù)據(jù)成員。最終數(shù)據(jù)成員可以在聲明時(shí)進(jìn)行初始化,也可以通過構(gòu)造方法賦值,但不能在程序的其他部分賦值,它的值在程序的整個(gè)執(zhí)行過程中是不能改變的。所以,也可以說用final修飾的數(shù)據(jù)成員是標(biāo)識符常量。例如:finaltypevariableName;final修飾成員變量和定義的同時(shí)給出初始值,而修飾局部變量時(shí)不作要求。用final關(guān)鍵字說明常量時(shí),需要注意兩點(diǎn):(1)需要說明常量的數(shù)據(jù)類型并指明常量的具體值。(2)若一個(gè)類有多個(gè)對象,而某個(gè)數(shù)據(jù)成員是常量,最好將此常量聲明為static,即用staticfinal兩個(gè)關(guān)鍵字修飾,這樣可以節(jié)省空間。2.?final修飾成員方法用final修飾的方法稱為最終方法,如果類中的某個(gè)方法被final限定為最終方法,則該類的子類就不能覆蓋父類的方法,即不能再重新定義與此方法同名的自己的方法,而僅能使用從父類繼承來的方法。這樣做的好處是避免因?yàn)E用重載機(jī)制(修改從父類那里繼承來的某些數(shù)據(jù)成員及成員方法,有時(shí)對于程序設(shè)計(jì)是很方便的)給系統(tǒng)安全性帶來的威脅,相當(dāng)于“鎖定”方法。final修飾方法,則該方法不能被子類重寫,代碼如下:finalreturnTypemethodName(paramList){…}3.?final修飾類final修飾類,則類不能被繼承,代碼如下:finalclassfinalClassName{…}final修飾類時(shí),所有包含在final類中的方法,都可自動(dòng)成為final方法。5.4類和繼承5.4.1繼承對象是以類的形式來定義的。Dog小狗類和Penguin企鵝類的屬性和方法如圖5.26所示。Dog小狗類和Penguin企鵝類使用繼承優(yōu)化后,如圖5.27所示。下面討論用繼承機(jī)制帶來的好處。(1)子類提供了特殊的行為,這是在父類中所沒有的。通過使用繼承,程序員可以多次重新使用在父類中的代碼。(2)程序員可以在父類(稱為抽象類)中定義公共屬性和方法。其他部分屬性和方法由程序員在子類中實(shí)現(xiàn)。(3)通過繼承實(shí)現(xiàn)代碼復(fù)用。Java中所有的類都是通過直接或間接地繼承java.lang.Object類得到的(如果不出現(xiàn)extends子句,則該類的父類是java.lang.Object)。繼承而得到的類稱為子類,被繼承的類稱為父類。子類不能繼承父類中訪問權(quán)限為private的成員變量和方法。子類可以重寫父類的方法,以及命名與父類同名的成員變量。但Java不支持多重繼承,即一個(gè)類從多個(gè)超類派生的能力。使用繼承的步驟如下:(1)編寫父類,運(yùn)行代碼如圖5.28所示。(2)編寫子類,使其繼承父類,運(yùn)行代碼如圖5.29所示。Java中通過super來實(shí)現(xiàn)對父類成員的訪問,super用來引用當(dāng)前對象的父類。使用super有以下三種情況:(1)訪問父類被隱藏的成員變量,如:super.variable;(2)調(diào)用父類中被重寫的方法,如:super.Method([paramlist]);(3)調(diào)用父類的構(gòu)造函數(shù),如:super([paramlist]);5.4.2抽象類和抽象方法假設(shè)要編寫一個(gè)計(jì)算圓、三角形、矩形面積與周長的程序,先定義三個(gè)類:圓類、三角形類、矩形類,如圖5.30所示。分析這三個(gè)類,都要計(jì)算面積和周長,雖然公式不同但目標(biāo)相同,因此可以為這三個(gè)類抽象出一個(gè)父類,在父類里定義共有的數(shù)據(jù)成員和成員方法,而具體的計(jì)算可在子類中實(shí)現(xiàn)。這樣,通過父類就大概知道子類所要完成的任務(wù),而且這些方法還可以應(yīng)用于相關(guān)的其他類,如求解平行四邊形、梯形的面積與周長。抽象類如圖5.31所示。Java語言中,用abstract關(guān)鍵字來修飾一個(gè)類時(shí),這個(gè)類叫做抽象類;用abstract關(guān)鍵字來修飾一個(gè)方法時(shí),這個(gè)方法叫做抽象方法,其格式如下:abstractclassabstractClass{…} //抽象類abstractreturnTypeabstractMethod([paramlist]); //抽象方法抽象類體現(xiàn)數(shù)據(jù)抽象的思想,是實(shí)現(xiàn)程序多態(tài)性的一種手段。定義抽象類的目的是提供可由其子類共享的一般形式,子類可根據(jù)自身需要擴(kuò)展抽象類。抽象類必須被繼承,抽象方法必須被重寫(抽象方法沒有方法體,也沒有空方法體)。抽象方法只需聲明,無需實(shí)現(xiàn);抽象類不能被實(shí)例化(即不能用new來生成一個(gè)實(shí)例對象),不一定要包含抽象方法。若類中包含了抽象方法,則該類必須被定義為抽象類。抽象方法可與public、protected復(fù)合使用,但不能與final、private、static復(fù)合使用。在下列情況下,某個(gè)類被定義為抽象類:(1)當(dāng)類的一個(gè)或多個(gè)方法為抽象方法時(shí)。(2)當(dāng)類為一個(gè)抽象類的子類,并且沒有為所有抽象方法提供實(shí)現(xiàn)細(xì)節(jié)或方法主體時(shí)。(3)當(dāng)類實(shí)現(xiàn)一個(gè)接口,并且沒有為所有抽象方法提供實(shí)現(xiàn)細(xì)節(jié)或方法主體時(shí)。5.5類和多態(tài)多態(tài)是面向?qū)ο蟪绦蛟O(shè)計(jì)的一個(gè)重要特征。利用多態(tài)性可以設(shè)計(jì)和實(shí)現(xiàn)一個(gè)易于擴(kuò)展的系統(tǒng)。在Java程序設(shè)計(jì)中,多態(tài)性是指具有不同功能的方法可以用同一個(gè)方法名,這樣就可以用一個(gè)方法名調(diào)用不同內(nèi)容的方法。在面向?qū)ο蟮姆椒ㄖ卸鄳B(tài)性可以這樣描述:向不同的對象發(fā)送同一條消息,不同的對象在接收時(shí)會產(chǎn)生不同的行為(方法)。也就是說,對象可以用自己的方式去響應(yīng)共同的消息。多態(tài)機(jī)制有兩種:重載(Overloading)和重寫(也稱覆蓋Override)。在同一類中定義了多個(gè)同名而內(nèi)容不同的成員方法時(shí),這些方法稱為重載,如圖5.32所示。類中允許同名的方法,其參數(shù)必須不同,或者是參數(shù)的個(gè)數(shù)不同,或者是參數(shù)類型不同。返回類型不能用來區(qū)分重載的方法。參數(shù)類型的區(qū)分度一定要足夠,不能是同一簡單類型的參數(shù),如int與long。由繼承機(jī)制可知子類可以繼承父類的方法,但是子類的某些特征可能與從父類中繼承來的特征有所不同,為了體現(xiàn)子類的這種個(gè)性,Java允許子類對父類的同名方法重新進(jìn)行定義,即在子類中定義與父類中已定義的同名而內(nèi)容不同的方法,這種多態(tài)稱為重寫。重寫方法的調(diào)用原則:Java運(yùn)行時(shí),系統(tǒng)根據(jù)調(diào)用該方法的實(shí)例來決定調(diào)用哪個(gè)方法。對子類的一個(gè)實(shí)例,如果子類重寫了父類的方法,則運(yùn)行時(shí)系統(tǒng)調(diào)用子類的方法;如果子類繼承了父類的方法(未重寫),則運(yùn)行時(shí)系統(tǒng)調(diào)用父類的方法。用重寫實(shí)現(xiàn)打印機(jī),分為黑白打印機(jī)和彩色打印機(jī),不同類型的打印機(jī)打印的效果會不同,如圖5.33所示。使用多態(tài)實(shí)現(xiàn)的思路如下:(1)編寫父類。(2)編寫子類和子類重寫父類方法。(3)運(yùn)行時(shí),使用父類的類型和子類的對象。多態(tài)實(shí)現(xiàn)的運(yùn)行代碼如圖5.34所示。5.6接口接口(Interface)和內(nèi)部類(InnerClass)為我們提供了一種用來組織和控制系統(tǒng)中的對象更加精致的方法。Java不支持多重繼承,即一個(gè)類至多只有一個(gè)直接父類,如果要實(shí)現(xiàn)類似于多重繼承的功能,則要用接口。Java中取締多重繼承,目的就是制止濫用繼承(導(dǎo)致難以預(yù)測的沖突)。接口是一個(gè)收集若干個(gè)方法和常數(shù)表單的屬性集合。當(dāng)類需要實(shí)現(xiàn)這種特定功能,就要執(zhí)行一個(gè)接口,在那個(gè)接口中執(zhí)行所有的方法。interface關(guān)鍵字使abstract的概念更向前邁進(jìn)了一步??梢詫⑺醋鍪恰凹兇獾摹背橄箢?。它允許類的創(chuàng)建者為類建立其形式,有方法名、參數(shù)列表和返回類型,但沒有任何方法體。接口可以包含字段,但是它們隱式為static和final。接口只提供形式,而未提供任何具體實(shí)現(xiàn)。接口的實(shí)質(zhì)是“更高級的抽象”。接口是抽象類的一種,只包含常量和方法的定義,而沒有變量和方法的實(shí)現(xiàn),且其方法都是抽象方法。它的用處體現(xiàn)在以下幾個(gè)方面:(1)通過接口可以實(shí)現(xiàn)不相關(guān)類的相同行為,而無需考慮這些類之間的層次關(guān)系。(2)通過接口可以指明多個(gè)類需要實(shí)現(xiàn)的方法。(3)通過接口可以了解對象的交互界面,而無需了解對象所對應(yīng)的類。接口的運(yùn)行代碼如圖5.35所示。5.7包5.7.1創(chuàng)建包在Java程序的源代碼中,package作為Java源文件的第一條語句,指明該文件定義的類所在的包,它的格式為:packagepkg1[.pkg2[.pkg3...]];包命名規(guī)范如下:(1)包名由小寫字母組成,不能以圓點(diǎn)開頭或結(jié)尾。(2)包名之前最好加上唯一的前綴,通常使用組織倒置的網(wǎng)絡(luò)域名。(3)包名后續(xù)部分依不同機(jī)構(gòu)內(nèi)部的規(guī)范不同而不同。創(chuàng)建包的運(yùn)行代碼如圖5.36所示,在類名之前聲明包。使用Eclipse創(chuàng)建包的兩種方法如下:(1)分別創(chuàng)建包和類:創(chuàng)建項(xiàng)目→創(chuàng)建包→創(chuàng)建類。(2)創(chuàng)建類的過程中創(chuàng)建類所在的包:創(chuàng)建項(xiàng)目→創(chuàng)建包和類。5.7.2導(dǎo)入包當(dāng)程序中沒有用到package語句來指明一個(gè)包時(shí),文件中所有的類都放到默認(rèn)的無名包中,它對應(yīng)于當(dāng)前的工作目錄,編譯和運(yùn)行都比較簡單。當(dāng)程序中用package語句指明一個(gè)包,編譯時(shí)產(chǎn)生的字節(jié)碼文件(.class文件)需要放到相應(yīng)的目錄下,可以手工建立子目錄,再將?.class文件復(fù)制到相應(yīng)的目錄下。為了使用不在同一包中的類,需要在Java程序中使用import關(guān)鍵字導(dǎo)入這個(gè)類,如圖5.37所示。5.7.3包的內(nèi)容一旦創(chuàng)建了一個(gè)類,并想重復(fù)地使用它,那么把它放在一個(gè)包中將是非常有效的,包(Package)是一組類的集合。例如,Java本身提供了許多包。程序員可以為自己的幾個(gè)相關(guān)的類創(chuàng)建一個(gè)包。把類放入一個(gè)包內(nèi)后,對包的引用可以替代對類的引用。此外,包這個(gè)概念也為使用類的數(shù)據(jù)與成員函數(shù)提供了許多方便。沒有被public、private修飾的類成員也可以被同一個(gè)包中的其他類所使用。這就使相似的類能夠訪問彼此的數(shù)據(jù)和成員函數(shù),而不用專門去作一些說明。表5.2列出了Java自帶的一些常用包。5.7.4包對象和規(guī)范在Java程序中,如果要想使一個(gè)類在多個(gè)不同的場合反復(fù)使用,可以把它存放在一個(gè)稱之為“包”的程序組織單位中??梢哉f,包是接口和類的集合,或者說包是接口和類的容器。使用包有利于實(shí)現(xiàn)不同程序間類的重用。Java語言為編程人員提供了自行定義包的機(jī)制。包的作用有兩個(gè):一是劃分類名空間,二是控制類之間的訪問。(1)因?yàn)榘且粋€(gè)類名空間,所以同一個(gè)包中的類(包括接口)不能重名,而不同包中的類可以重名。(2)類之間的訪問控制是通過類修飾符來實(shí)現(xiàn)的,若類聲明修飾符public,則表明該類不僅可供同一個(gè)包中的類訪問,也可以被其他包中的類訪問;若類聲明無修飾符,則表
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025鍍鋅鋼管骨架采購合同
- 2025二級建造師建設(shè)工程施工管理考點(diǎn):合同管理索賠程序
- 2025年武漢單身公寓租賃合同模板
- 2025設(shè)備安裝合作協(xié)議合同范本
- 2025信息安全咨詢技術(shù)合同
- 2025水果收購合同書樣本
- 2025【景觀設(shè)計(jì)合同】景觀工程設(shè)計(jì)包括內(nèi)容
- 《胃鏡檢查技術(shù)》課件
- 2025標(biāo)準(zhǔn)簡化版合同范本
- 2025標(biāo)準(zhǔn)版:員工簽訂長期合同協(xié)議范本
- 《中國海洋大學(xué)》課件
- 排污許可管理培訓(xùn)課件
- 《鹽津鋪?zhàn)庸居芰μ轿鰧?shí)例報(bào)告(10000字論文)》
- 2025年中考語文課內(nèi)名著閱讀專題復(fù)習(xí):第10部 《水滸傳》課件
- 案例:中建八局綠色施工示范工程綠色施工(76P)
- 水產(chǎn)養(yǎng)殖技術(shù)培訓(xùn)
- 2025年希望數(shù)學(xué)五年級培訓(xùn)題(含答案)
- 保潔投標(biāo)書范本
- 2025年中小學(xué)生讀書知識競賽題庫及答案
- 第六講當(dāng)前就業(yè)形勢與實(shí)施就業(yè)優(yōu)先戰(zhàn)略-2024年形勢與政策
- 社會醫(yī)學(xué)(含考試)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
評論
0/150
提交評論