版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第3章 面向?qū)ο蟪绦蛟O(shè)計高級,郭建宏,椅子大戰(zhàn),從前,有一間軟件小鋪,裡面有兩個程序員被指派去設(shè)計一個程序。 壞心的老闆娘兼項目經(jīng)理要求兩個人比賽,贏的人可以坐上象徵身份地位的AeronTM寶椅。 程序開發(fā)高手阿珠和面向?qū)ο蟮男磐桨⒒▋蓚€人都相信自己贏的可能性很大。,需求,在圖形接口中畫出四方形(squre),圓形(circle)和三角形(triangle),圖形需要順時針繞中心旋轉(zhuǎn),同時輸出AIF音效文件。,阿珠是怎樣做的?,和以往一樣,阿珠準(zhǔn)備好開始設(shè)計重要的程序。沒幾下就寫出了rotate和playSound方法。 rotate() / 繞中心旋轉(zhuǎn)360度。 playSound() /
2、播放aif文件。 ,阿花是怎樣做的?,阿花分別為三個形狀各寫出一個類。,新的需求(一),前面的形狀需要加上阿米巴原蟲(Amoeba)形狀。 用戶點選時也是旋轉(zhuǎn)并播放.hif的聲音文件。,阿珠該怎樣做?,原來的rotate程序還可以用。 但是playSound就得要修改。 雖然修改的幅度不大,但是阿珠實在不想去碰已經(jīng)測試過的程序代碼。他應(yīng)該很清楚,不管項目經(jīng)理怎么保證,需求就是會不停的改。 playSound(shapeNum) / 參數(shù)用來標(biāo)識傳入的是否是amoeba圖形 / 如果不是阿米巴形狀,則播放.aif文件。 / 如果是則播放.hif文件 ,阿花該怎樣做?,阿花則寫出一個新的類。 面向
3、對象讓他最喜歡的其中一點就是有時不需改動已經(jīng)測試好的程序就可以達(dá)成新的目標(biāo)。 面向?qū)ο蟮倪m應(yīng)性和可擴展性讓他面對修改時不會覺得太痛苦。,新的需求(二),阿米巴蟲在旋轉(zhuǎn)的時候需要以給定的作為原點旋轉(zhuǎn)。,阿珠該怎樣做?,阿珠最好還是幫rotate程序加上軸心點的參數(shù)。這樣就有一堆程序要改。 本來已經(jīng)測試好的東西全部又得重來一遍。 rotate(shapeNum, xPt, yPt) / 如果不是阿米巴,則繞中心旋轉(zhuǎn)。 / 否則以xPt和yPt作為旋轉(zhuǎn)中心旋轉(zhuǎn)。 ,阿花該怎樣做,阿花修改rotate這個方法,但不是每個都要修改,只修改Amoeba這個類而已。 其他已經(jīng)測試、編譯過的部分完全沒有必要修
4、改。 該類需要的修改就是加上旋轉(zhuǎn)軸心點的屬性。,問題的解決,從上面的分析可以看出,阿花的設(shè)計是非常好的。 但是還有一個問題,在每個類中rotate和playSound有很多都是重復(fù)的。這樣做太沒有效率了。該怎樣解決這樣的問題呢? 答案就是應(yīng)用“繼承”來解決。,怎樣繼承,繼承概述,多個類中存在相同屬性和行為時,將這些內(nèi)容抽取到單獨一個類中,那么多個類無需再定義這些屬性和行為,只要繼承單獨的那個類即可。 多個類可以稱為子類,單獨這個類稱為父類或者超類。 通過extends關(guān)鍵字讓類與類之間產(chǎn)生繼承關(guān)系。 class SubDemo extends Demo 子類繼承父類后,都繼承了父類的那些哪些成
5、員呢? 子類繼承了父類的屬性,包括私有屬性。 子類繼承了除構(gòu)造方法外的其他所有方法。 問題: 為什么子類對象在實例化之前必須首先調(diào)用父類中的構(gòu)造方法之後再調(diào)用子類自己的構(gòu)造方法?,繼承的特點,Java只支持單繼承,不支持多繼承。 一個類只能有一個父類,不可以有多個父類。 class SubDemo extends Demo /ok class SubDemo extends Demo1,Demo2./error Java支持多層繼承(繼承體系) class A class B extends A class C extends B 子類對象實例化 子類對象在實例化之前必須首先調(diào)用父類中的構(gòu)造方
6、法之後再調(diào)用子類自己的構(gòu)造方法。 定義繼承需要注意 不要僅為了獲取其他類中的某個功能而去繼承。 類與類之間要有所屬(“is a”)的關(guān)系,xx1是xx2的一種。,阿米巴的rotate該怎么辦?,阿米巴形狀會需要完全不同的rotate和playSound程序,如果都繼承Shape,那旋轉(zhuǎn)的功能就都一樣了。 解決方法:Amoeba這個類可以覆蓋(override)Shape的方法。(多態(tài)),阿米巴的rotate該怎么辦?,方法覆寫(Override),子類中出現(xiàn)與父類一模一樣的方法時,會出現(xiàn)覆蓋操作,也稱為重寫或者復(fù)寫。 父類中的私有方法不可以被覆蓋。 在子類覆蓋方法中,繼續(xù)使用被覆蓋的方法可以通
7、過“super.函數(shù)名”獲取(super關(guān)鍵字部分介紹)。 覆蓋注意事項 覆蓋時,子類方法權(quán)限一定要大于父類方法權(quán)限。 privateprotecteddefaultpublic 靜態(tài)只能覆蓋靜態(tài)。 覆蓋的應(yīng)用 當(dāng)子類需要父類的功能,而功能主體子類有自己特有內(nèi)容時,可以復(fù)寫父類中的方法,這樣,即沿襲了父類的功能,又定義了子類特有的內(nèi)容。,重載和覆寫的區(qū)別,繼承的意義,繼承的出現(xiàn)提供了代碼的復(fù)用性。 繼承的出現(xiàn)讓類與類之間產(chǎn)生了關(guān)系,提供了多態(tài)的前提。 子類繼承父類可以擴展已有類的功能。 在工程中,父類一般都提供一個接口。(此問題在抽象類/接口部分解釋),super關(guān)鍵字,this代表本類引用,
8、super代表父類引用。 super和this的用法相同。 如果在子類中調(diào)用父類的同名方法,可以使用super關(guān)鍵字調(diào)用。 當(dāng)子類和父類出現(xiàn)同名成員的時候,可以使用super進行區(qū)分。 子類要調(diào)用父類的構(gòu)造方法的時候,可以使用super關(guān)鍵字調(diào)用。 this和super都可以調(diào)用構(gòu)造方法,但是兩者是不可以同時出現(xiàn)的,因為兩者調(diào)用構(gòu)造時必須放在構(gòu)造方法的首行。 無論子類如何操作,最終必須要首先調(diào)用父類中的構(gòu)造方法。 super關(guān)鍵字最重要的作用就是用基類有參數(shù)的構(gòu)造方法構(gòu)造派生類的對象。,總結(jié)子類實例化過程,子類中所有的構(gòu)造方法函數(shù)都會訪問父類中空參數(shù)的構(gòu)造函數(shù)。因為每一個構(gòu)造函數(shù)的第一行都有一
9、條默認(rèn)的語句super(); 子類會具備父類中的數(shù)據(jù),所以要先明確父類是如何對這些數(shù)據(jù)初始化的。 當(dāng)父類中沒有空參數(shù)的構(gòu)造函數(shù)時,子類的構(gòu)造函數(shù)必須通過this或者super語句指定要訪問的構(gòu)造函數(shù)。,final關(guān)鍵字,final可以修飾類,方法,變量。 final修飾的類不可以被繼承。 final修飾的方法不可以被覆蓋。 final修飾的變量是一個常量。只能被賦值一次。 全局常量的聲明 使用static final關(guān)鍵字聯(lián)合聲明的變量稱為全局常量: public static final String INFO=“GJH”; 內(nèi)部類只能訪問final修飾的局部變量。,椅子大戰(zhàn)的新需求(三),
10、現(xiàn)在需要重新定義各種形狀旋轉(zhuǎn)的度數(shù) 圓形90度。 矩形180度。 三角形270度。 阿米巴形不變。,需求分析,現(xiàn)在發(fā)現(xiàn),rotate方法在父類中根本沒有任何的作用,如果硬要寫一些內(nèi)容的話,不是太浪費了? 所以最好的解決方案是在父類中只留一個聲明,具體的實現(xiàn)放到子類中實現(xiàn)。 要想這樣實現(xiàn)就必須依靠“抽象類”。,抽象類概述,抽象定義: 抽象就是從多個事物中將共性的,本質(zhì)的內(nèi)容抽取出來。 例如:狼和狗共性都是犬科,犬科就是抽象出來的概念。 抽象類: Java中可以定義沒有方法體的方法,該方法的具體實現(xiàn)由子類完成,該方法稱為抽象方法,包含抽象方法的類就是抽象類。 抽象方法的由來: 多個對象都具備相同的
11、功能,但是功能具體內(nèi)容有所不同,那么在抽取過程中,只抽取了功能定義,并未抽取功能主體,那么只有功能聲明,沒有功能主體的方法稱為抽象方法。 例如:狼和狗都有吼叫的方法,可是吼叫內(nèi)容是不一樣的。所以抽象出來的犬科雖然有吼叫功能,但是并不明確吼叫的細(xì)節(jié)。,抽象類的特點,抽象類和抽象方法必須用abstract關(guān)鍵字來修飾。 抽象方法只有方法聲明,沒有方法體,定義在抽象類中。 格式:修飾符 abstract 返回值類型 函數(shù)名(參數(shù)列表) ; 抽象類不可以被實例化,也就是不可以用new創(chuàng)建對象。原因如下: 抽象類是具體事物抽取出來的,本身是不具體的,沒有對應(yīng)的實例。例如:犬科是一個抽象的概念,真正存在的
12、是狼和狗。 而且抽象類即使創(chuàng)建了對象,調(diào)用抽象方法也沒有意義。 抽象類通過其子類實例化,而子類需要覆蓋掉抽象類中所有的抽象方法后才可以創(chuàng)建對象,否則該子類也是抽象類。,抽象類的思考,問題1:一個抽象類可以使用final關(guān)鍵字嗎? 問題2:一個抽象類中可以定義構(gòu)造方法嗎?,回答,問題一: 一個類如果使用了final關(guān)鍵字聲明,則此類不能被子類繼承,而抽象類又必須被子類覆寫,所以很明顯,第一個問題的答案是:“一個抽象類不能使用final關(guān)鍵字聲明”。 問題二: 實際上在一個抽象類中允許存在構(gòu)造方法,因為抽象類依然使用的是類的繼承關(guān)係,而且抽象類中也存在各個屬性,所以子類在實例化之前一定要先對父類進
13、行實例化。,抽象類總結(jié),包含一個抽象方法的類必須是抽象類。 抽象類和抽象方法都要使用abstract關(guān)鍵字聲明。 抽象方法只可以聲明而不可以實現(xiàn)。 抽象類使用的時候一定要有子類。 子類仍然使用extends關(guān)鍵字繼承一個抽象類,同樣會存在單繼承的關(guān)係。 一個子類不能同時繼承多個抽象類。 子類(如果不是抽象類)必須覆寫抽象類中的全部抽象方法。 抽象類中絕對不能使用final關(guān)鍵字聲明。 抽象類中允許有構(gòu)造方法,而且完全符合子類獨享的實例化過程。,椅子大戰(zhàn)新的需求(四),現(xiàn)在將每一種形狀播放的聲音進行更改 圓形播放cir文件的聲音文件。 四方形播放squ文件的聲音文件。 三角形播放tri文件的聲音
14、文件。 阿米巴形不變。,需求分析,現(xiàn)在遇到了和抽象類中一樣的問題,就是playSound方法在父類中也失去了作用,當(dāng)然按照抽象類的方法可以將這個方法也聲明為抽象方法。 這個時候可以看出,父類中的所有的方法都是抽象方法了,這實際上就變成了一個“接口”。,接口的概念及定義,接口可以理解為一種特殊的類,裡面全部是由全局常量和公共的抽象方法組成。 成員常量:public static final 成員方法:public abstract 接口的定義格式 權(quán)限限定 interface 接口名稱 全局變量; 抽象方法; ,實現(xiàn)接口,與抽象類一樣,接口若要使用也必須通過子類,子類通過implements關(guān)鍵
15、字實現(xiàn)接口。 實現(xiàn)格式: public class 子類 implements 接口A,接口B, 接口的出現(xiàn)將“多繼承”通過另一種形式體現(xiàn)出來,即“多實現(xiàn)”,這就可以彌補Java在類的繼承中只可以單繼承的局限。,接口的特點,接口是對外暴露的規(guī)則。 接口是程序的功能擴展。 接口可以用來多實現(xiàn)。 類與接口之間是實現(xiàn)關(guān)系,而且類可以繼承一個類的同時實現(xiàn)多個接口。 接口與接口之間可以有繼承關(guān)系。,椅子大戰(zhàn)的編碼需求(五),在客戶端需要編寫兩個方法 testPlaySound方法:可以測試所有形狀的聲音。 testRotate方法:可以測試所有形狀的旋轉(zhuǎn)。,需求分析,按照以前的知識,要想實現(xiàn)前面的內(nèi)容,
16、就必須要寫多個方法,那么如何實現(xiàn)一個方法可以接受不同形狀的調(diào)用呢? 解決方案就是使用面向?qū)ο笾凶钪匾母拍睢岸鄳B(tài)”。,多態(tài)的概念,定義:某一類事物的多種存在形態(tài)。 例:動物中貓,狗。 貓這個對象對應(yīng)的類型是貓類型 貓 x = new 貓(); 同時貓也是動物中的一種,也可以把貓稱為 動物。 動物 y = new 貓(); 動物是貓和狗具體事物中抽取出來的父類型。 父類型引用指向了子類對象,這實際上就是向上轉(zhuǎn)型。,多態(tài)的概念,體現(xiàn): 父類或者接口的引用指向或者接收自己的子類對象。 作用: 多態(tài)的存在提高了程序的擴展性和后期可維護性。 前提: 需要存在繼承或者實現(xiàn)關(guān)系。 要有覆蓋操作。,多態(tài)的特點,方法: 編譯時:要查看引用變量所屬的類中是否有所調(diào)用的成員。 在運行時:要查看對象所屬的類中是否有所調(diào)用的成員。 屬性: 只看引用變量所屬的類。,椅子大戰(zhàn)的新需求(六),需要在輸出聲音之前提示用戶“即將開始播放聲音”。 需要在輸出聲音之后提示
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 智能醫(yī)療信息化建設(shè)
- 醫(yī)療機器人市場前景
- 醫(yī)療機器人技術(shù)在手術(shù)輔助中的應(yīng)用
- 醫(yī)療信息化在提高醫(yī)療質(zhì)量中的作用
- 2026年熱塑性復(fù)合材料項目公司成立分析報告
- 醫(yī)療信息化與醫(yī)療大數(shù)據(jù)平臺構(gòu)建
- 醫(yī)院財務(wù)科主任談財務(wù)管理工作
- 醫(yī)療信息化建設(shè)與大數(shù)據(jù)
- 陜西省延安市2025-2026學(xué)年九年級上學(xué)期12月月考物理試題(解析版)
- 課件用的底色
- new共青團中央所屬單位2026年度高校畢業(yè)生公開招聘66人備考題庫及完整答案詳解
- (更新)卵巢癌分子病理檢測臨床應(yīng)用指南解讀課件
- 2025云南昆明巫家壩城市發(fā)展建設(shè)有限公司社會招聘14人參考筆試題庫及答案解析
- 無創(chuàng)正壓通氣護理技術(shù)團體標(biāo)準(zhǔn)2026
- 鋼結(jié)構(gòu)廠房拆除施工方案設(shè)計
- 2026共青團中央所屬單位高校畢業(yè)生招聘66人考試筆試備考題庫及答案解析
- T/ZGZS 0302-2023再生工業(yè)鹽氯化鈉
- 斜弱視眼科學(xué)
- 電商平臺需求規(guī)格說明書-通用版本
- GB/T 3372-2010拖拉機和農(nóng)業(yè)、林業(yè)機械用輪輞系列
- 北京城市旅游故宮紅色中國風(fēng)PPT模板
評論
0/150
提交評論