第5章 面向?qū)ο蟪绦蛟O計_第1頁
第5章 面向?qū)ο蟪绦蛟O計_第2頁
第5章 面向?qū)ο蟪绦蛟O計_第3頁
第5章 面向?qū)ο蟪绦蛟O計_第4頁
第5章 面向?qū)ο蟪绦蛟O計_第5頁
已閱讀5頁,還剩47頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

5.1面向?qū)ο蟪绦蛟O計的思想

5.2類和對象

5.3類和封裝

5.4類和繼承

5.5類和多態(tài)

5.6接口

5.7包

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論