面向?qū)ο缶幊袒A(chǔ) (二)_第1頁
面向?qū)ο缶幊袒A(chǔ) (二)_第2頁
面向?qū)ο缶幊袒A(chǔ) (二)_第3頁
面向?qū)ο缶幊袒A(chǔ) (二)_第4頁
面向?qū)ο缶幊袒A(chǔ) (二)_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

面向?qū)ο缶幊袒A(chǔ)(二)軟件學(xué)院代飛2014.春生活中的接口聲卡顯卡網(wǎng)卡每種卡的內(nèi)部結(jié)構(gòu)都不相同,可以把聲卡、網(wǎng)卡、顯卡都插在PCI插槽上,而不用擔(dān)心哪個插槽是專門插哪個卡的主板Java接口publicinterfacePCI{

publicvoidstart();

publicvoidstop();

}classSoundCardimplementsPCI{publicvoidstart()

{

System.out.println("Dudu...");

}

publicvoidstop()

{

System.out.println("Soundstop!");

}

}Java接口中定義的方法在不同的地方被實現(xiàn),可以具有完全不同的行為這是Java接口,相當(dāng)于主板上的PCI插槽的規(guī)范classNetworkCardimplementsPCI{publicvoidstart()

{

System.out.println("Send...");

}

publicvoidstop()

{

System.out.println("Networkstop!");

}

}聲卡、網(wǎng)卡都實現(xiàn)了PCI插槽的規(guī)范,但行為完全不同基于接口的多態(tài)publicclassAssembler{

publicstaticvoidmain(String[]args){

PCInc=newNetworkCard();

PCIsc=newSoundCard();

nc.start();sc.start();

}

}Dudu...Send...控制臺輸出案例軟件學(xué)院需開發(fā)這樣一個小系統(tǒng),包含:軟件學(xué)院、教師、系、打印機(jī),具體要求如下:

1、教師和系都具有方法:輸出詳細(xì)信息2、 軟件學(xué)院具有屬性:打印機(jī),能夠打印教師、系、軟件學(xué)院的詳細(xì)信息

3、系統(tǒng)要具備良好的可擴(kuò)展性與可維護(hù)性打印教師系教師

詳細(xì)信息系

詳細(xì)信息detail方法(輸出詳細(xì)信息)軟件學(xué)院publicclassSoftwareTeacher{//輸出教師的詳細(xì)信息publicStringdetail(){ return“本人是軟件工程系教師";}}publicclassSoftwareSchool{privatePrinterprinter=newPrinter();//輸出中心的詳細(xì)信息publicStringdetail(){return“這是云南大學(xué)軟件學(xué)院";}//使用打印機(jī)打印教師信息publicvoidprint(SoftwareTeachert){printer.print(t.detail());}//使用打印機(jī)打印系信息publicvoidprint(SoftwareDepartments){ printer.print(s.detail());}}publicclassPrinter{publicvoidprint(Stringcontent){System.out.println("開始打?。?);System.out.println(content);}}每增加一種新類型,都需要增加相應(yīng)的print(類型名稱var)方法——程序的可擴(kuò)展性及可維護(hù)性極差——這不符合系統(tǒng)的要求publicclassSoftwareDepartment{publicStringdetail(){ return“這是軟件工程系";}}可以通過多態(tài)性解決這個問題嗎?如果教師和系都實現(xiàn)同一接口,接口類型的變量便可以指向教師對象,或者系對象了教師系detail方法(負(fù)責(zé)輸出詳細(xì)信息)教師

詳細(xì)信息系詳細(xì)信息回顧多態(tài)的含義:父類型的變量(reference)可以指向父對象,還可以指向子對象;教師、系都存在一個共同的方法特征:detail,它們對detail方法有各自不同的實現(xiàn)——這完全符合Java接口的定義定義一個Java接口,在其中定義detail方法,但沒有具體實現(xiàn)實現(xiàn)這個Java接口,不同的類對detail方法有不同的具體實現(xiàn)TeacherSoftwareTeacherNetworkTeacher定義一個Java接口,在其中定義detail方法,但沒有具體實現(xiàn)實現(xiàn)這個Java接口,不同的類對detail方法有不同的具體實現(xiàn)DepartmentSoftwareDepartmentNetworkDepartmentpublicinterfaceTeacher{publicStringdetail();}publicclassSoftwareSchool{privatePrinterprinter=newPrinter();//輸出學(xué)院的詳細(xì)信息publicStringdetail(){return“這里是軟件學(xué)院";}//使用學(xué)院打印機(jī)打印教師publicvoidprint(Teachert){ printer.print(t.detail());}//使用學(xué)院打印機(jī)打印教師publicvoidprint(Departmentd){ printer.print(d.detail());}}publicinterfaceDepartment{publicStringdetail();}通過Java接口,我們同樣可以享受到多態(tài)性的好處,大大提高了程序的可擴(kuò)展性及可維護(hù)性publicclassSoftwareTeacherimplementsTeacher{publicStringdetail(){ return“本人是軟件工程系教師";}}publicclassSoftwareDepartmentimplementsdepartment{

publicStringdetail(){ return“這是軟件工程系";}}接口接口是一種類似于類的結(jié)構(gòu),但是接口中只能包含常量和抽象方法。

為了和類區(qū)別,定義接口使用下面的語法:[public]interface接口名[extends父接口列表]{

常量聲明

抽象方法}final的用法finalclass不能被繼承finalclassMath{...}final變量就是常量:finaldoublePI=3.14159;final方法不能被覆蓋什么是常量?常量是一種標(biāo)識符,它的值在運行期間恒定不變常量標(biāo)識符在程序中只能被引用,而不能被重新賦值常量圓周率PI圓周率PI代碼表示方式publicstaticfinaldoublePI

=3.14159265358979323846;用法將ang角度轉(zhuǎn)換成徑度publicstaticdoubletoRadians(doubleang){returnang/180.0*PI;}常量的優(yōu)點如果不使用常量,直接在程序中填寫數(shù)字或字符串,將會有什么麻煩?publicstaticdoubletoRadians(doubleang){returnang/180.0*3.14159265358979323846;}publicstaticdoubletoDegrees(doubleang){returnang*180.0/3.14159265358979323846;}publicstatic

finaldoublePI=3.14159265358979323846;//圓周率publicstaticdoubletoRadians(doubleang){returnang/180.0*PI;}publicstaticdoubletoDegrees(doubleang){returnang*180.0/PI;}程序的可讀性變差:用戶很難理解數(shù)字或字符串的意思程序的可維護(hù)性變差:如果數(shù)值改變,則需要在很多地方改動,既麻煩又易出錯使用常量可以增強(qiáng)程序的可讀性、可維護(hù)性JAVA中常量的定義規(guī)則加入final關(guān)鍵字代表常量,加入static關(guān)鍵字代表類變量盡量使用含義直觀的常量來表示那些將在程序中多次出現(xiàn)的數(shù)字或字符串publicclassStudent{publicstaticfinalintFEMALE=1;//代表女性publicstaticfinalintMALE=2;//代表男性privateintsex;//性別publicvoidsetSex(intsex){if(sex==FEMALE) System.out.println("這是一名女學(xué)生");elseif(sex==MALE) System.out.println("這是一名男學(xué)生");this.sex=sex;}}在Java接口中聲明常量在Java接口中聲明的變量在編譯時會自動加上staticfinal的修飾符,即聲明為常量,因而Java接口通常是存放常量的最佳地點publicinterfaceSoftwareSchool{

publicstaticfinalStringSoftwareEnginnering=“云南省軟件工程重點實驗室";;

publicstaticfinalStringCloudComputingEngineering=“云南省云計算工程中心";}publicinterfaceSoftwareSchool{StringSoftwareEnginnering=“云南省軟件工程重點實驗室";StringCloudComputingEngineering=“云南省云計算工程中心";}等同于抽象方法和抽象類抽象方法:有方法聲明沒有方法實現(xiàn)如果一個類中包含抽象方法,這個類就要聲明成抽象類,反之不成立abstractclassFigure{doubledim1,dim2;Figure(doublea,doubleb){ dim1=a; dim2=b;}

abstractdoublegetArea();//只有方法頭,沒有方法體}Figuref=newFigure(2,3);//抽象類不能實例化抽象類和抽象方法抽象類可以被繼承,由子類實現(xiàn)其抽象方法,否則其子類必須聲明成抽象類abstractclassFigure{doubledim1,dim2;Figure(doublea,doubleb){ dim1=a; dim2=b;}

abstractdoublegetArea();//只有方法頭,沒有方法體}abstractclassRectangleextendsFigure{Rectangle(doublea,doubleb){super(a,b);}}Rectangle類繼承了Figure類,但是沒有實現(xiàn)其內(nèi)部的抽象方法,必須聲明成抽象類抽象類和抽象方法abstractclassFigure{doubledim1,dim2;Figure(doublea,doubleb){ dim1=a; dim2=b;}

abstractdoublegetArea();//只有方法頭,沒有方法體}classTriangleextendsFigure{Triangle(doublea,doubleb){ super(a,b);}doublegetArea(){returndim1*dim2/2;}}Triangle類繼承了Figure類,并且實現(xiàn)了其內(nèi)部的抽象方法,無需聲明成抽象類publicinterfaceEdible{

//接口中的方法隱含public和abstractpublicStringhowToEat();}publicinterfaceRunnable{publicvoidrun();}publicinterfaceSleepable{intMAX=100;//接口中的變量隱含public,static,finalpublicvoidsleep();}接口接口不能實例化可以聲明接口類型的變量,用接口聲明出的變量是引用類型變量newRunnable();//錯誤Ediblee;RunnablerSleepables;實現(xiàn)接口classAnimal{}classChickenextendsAnimalimplementsEdible,Runnable{ publicStringhowToEat(){ return"炸著吃"; } publicvoidrun(){System.out.println("兩條腿跑"); }publicvoidlayAnEgg(){ System.out.println("母雞還可以生蛋"); }}一個類可以實現(xiàn)多個接口,多個接口間用逗號分隔實現(xiàn)接口的方法,返回類型,名字,參數(shù)列表和接口中定義的一模一樣,并且必須是public的classPigextendsAnimalimplementsEdible,Runnable,Sleepable

{ publicStringhowToEat(){ return"蒸著吃,烤著吃,紅燒,燉湯等等"; } publicvoidrun(){ System.out.println("四條腿跑"); }publicvoidsleep(){System.out.println(“最喜歡睡覺"); }}abstractclassCarimplementsEdible,Runnable{ publicvoidrun(){ System.out.println("四個輪子跑"); }}一個類如果聲明要實現(xiàn)一個接口,就必須實現(xiàn)接口中的所有方法,否則就要聲明成抽象類接口定義了行為的協(xié)議,可以被任何類實現(xiàn)。一個類如果聲明要實現(xiàn)一個接口,就必須實現(xiàn)接口中的所有方法,否則就要聲明成抽象類一個類可以實現(xiàn)多個接口,但是只能有一個父類。接口的實現(xiàn)實現(xiàn)了接口的類的對象,可以賦值給該接口的變量Ediblee=newChicken();//oke.howToEat();//ok,“炸著吃"e.run();//wrong,可以調(diào)用的方法的范圍是由變量決定的e.layAnEgg();//wrong,同上e=newCar();//wrong,Car類沒有實現(xiàn)Edible接口Sleepables=newPig();//oks.Run();面向接口編程開發(fā)系統(tǒng)時,主體構(gòu)架使用接口,接口構(gòu)成系統(tǒng)的骨架這樣就可以通過更換接口的實現(xiàn)類來更換系統(tǒng)的實現(xiàn)定義一個Java接口,在其中定義detail方法,但沒有具體實現(xiàn)實現(xiàn)這個Java接口,不同的類對detail方法有不同的具體實現(xiàn)TeacherSoftwareTeacherNetworkTeacher升級上述的系統(tǒng),要求: 打印機(jī)有多種類型,比如:黑白打印機(jī)、彩色打印機(jī)等 學(xué)院可能配備其中任意一款打印機(jī),負(fù)責(zé)打印教師、或者系的詳細(xì)信息 系統(tǒng)要具備良好的可擴(kuò)展性與可維護(hù)性print方法(打印)彩色打印機(jī)黑白打印機(jī)黑白內(nèi)容系/教師詳細(xì)信息彩色內(nèi)容采用面向接口編程的方式實現(xiàn),以下是三個步驟中的第一步:抽象出Java接口1、分析:黑白、彩色打印機(jī)都存在一個共同的方法特征:print黑白、彩色打印機(jī)對print方法有各自不同的實現(xiàn)2、結(jié)論:抽象出Java接口PrinterInterface,在其中定義方法print3、具體實現(xiàn):publicinterfacePrinterInterface{publicvoid

print(Stringcontent);}采用面向接口編程的方式實現(xiàn),以下是三個步驟中的第二步:publicclassColorPrinter

implementsPrinterInterfacepublicvoid

print(Stringcontent){System.out.println("彩色打印:");System.out.println(content);}}publicclassBlackPrinter

implementsPrinterInterface{publicvoid

print(Stringcontent){System.out.println("黑白打?。?);System.out.println(content);}}實現(xiàn)Java接口1、分析:已經(jīng)抽象出Java接口PrinterInterface,并在其中定義了print方法,黑白、彩色打印機(jī)對print方法有各自不同的實現(xiàn)2、結(jié)論:

黑白、彩色打印機(jī)都實現(xiàn)PrinterInterface接口,各自實現(xiàn)print方法3、具體實現(xiàn):采用面向接口編程的方式實現(xiàn),以下是三個步驟中的第三步:使用Java接口1、分析:主體構(gòu)架使用接口,讓接口構(gòu)成系統(tǒng)的骨架2、結(jié)論:更換實現(xiàn)接口的類就可以更換系統(tǒng)的實現(xiàn)3、具體實現(xiàn):publicclassSoftwarechool{privatePrinterInterfaceprinter;//打印機(jī)

publicvoidsetPrinter(PrinterInterfacep){this.printer=p;}publicStringdetail(){return“這里是云南大學(xué)軟件學(xué)院";}publicvoidprint(Teachert){

printer.print(t.detail());}publicvoidprint(Departmentd){

printer.print(d.detail());}}publicclassTest{publicstaticvoidmain(String[]args){//創(chuàng)建學(xué)院實例

SoftwareSchoolschool=newSoftwareSchool();SoftwareTeachert=newSoftwareTeacher();//為該學(xué)院配備黑白打印機(jī)

school.setPrinter(newBlackPrinter());school.print(t.detail());//為該學(xué)院配備彩色打印機(jī)SoftwareDepartmentd=newSoftwareDepartment();

school.setPrinter(new

ColorPrinter());school.print(d.detail());}}public

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論