第8章-面向?qū)ο蟮腏ava實(shí)現(xiàn)-接口解析課件_第1頁
第8章-面向?qū)ο蟮腏ava實(shí)現(xiàn)-接口解析課件_第2頁
第8章-面向?qū)ο蟮腏ava實(shí)現(xiàn)-接口解析課件_第3頁
第8章-面向?qū)ο蟮腏ava實(shí)現(xiàn)-接口解析課件_第4頁
第8章-面向?qū)ο蟮腏ava實(shí)現(xiàn)-接口解析課件_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

面向?qū)ο蟮腏ava實(shí)現(xiàn)-接口第八章面向?qū)ο蟮腏ava實(shí)現(xiàn)-接口第八章2回顧舉例說明在什么樣的情況下,需要使用到繼承?在Java程序中,多態(tài)性帶給我們的好處是什么?2回顧舉例說明在什么樣的情況下,需要使用到繼承?3預(yù)習(xí)檢查什么是常量?Java中,常量的定義規(guī)則有哪些?什么是面向接口編程,它的好處是什么?3預(yù)習(xí)檢查什么是常量?Java中,常量的定義規(guī)則有哪些?4本章任務(wù)升級(jí)HelloACCP,打印ACCP中心與教員的詳細(xì)信息:正確使用面向接口編程的思想提高系統(tǒng)的可擴(kuò)展性及可維護(hù)性4本章任務(wù)升級(jí)HelloACCP,打印ACCP中心與教員的詳5掌握J(rèn)ava接口理解Java接口與多態(tài)的關(guān)系掌握面向接口編程的思想掌握常量接口的使用本章目標(biāo)5掌握J(rèn)ava接口本章目標(biāo)抽象類可以使用abstract來修飾一個(gè)類和方法用abstract修飾的類表示這個(gè)類是一個(gè)抽象類,用abstract修飾的方法表示這個(gè)方法是一個(gè)抽象方法。抽象類不能被實(shí)例化抽象方法是只有方法聲明,而沒有實(shí)現(xiàn)的方法。構(gòu)造方法、靜態(tài)方法、私有方法、final方法不能被聲明為抽象的方法。6抽象類可以使用abstract來修飾一個(gè)類和方法6抽象類的例子publicabstractclassShape{/**畫出自己*/publicabstractvoiddraw();/**得到面積*/publicdoublegetArea(){return100.0;}}7抽象類的例子publicabstractclassSh抽象類(abstractclass)抽象類里面并非一定需要抽象方法,但是沒有抽象方法,抽象類就沒有存在的必要在以下任一條件成立時(shí),類必須定義成抽象類:–類中有至少一個(gè)抽象方法–類繼承了父類中的抽象方法,但是至少有一個(gè)抽象方法沒有實(shí)現(xiàn)–類實(shí)現(xiàn)了某個(gè)接口,但沒有全部實(shí)現(xiàn)接口中的方法8抽象類(abstractclass)抽象類里面并非一定需要?jiǎng)?chuàng)建抽象類的對象抽象類不可實(shí)例化如果從一個(gè)抽象類繼承,并想創(chuàng)建該新類的對象,那么我們就必須為基類中的所有抽象方法提供方法定義。如果不這樣做(可以選擇不做),那么抽象類的子類便也是抽象類,且編譯器將會(huì)強(qiáng)制我們用abstract關(guān)鍵字來限制修飾這個(gè)類。創(chuàng)建抽象類的對象–擴(kuò)展抽象類,實(shí)現(xiàn)其所有抽象方法–創(chuàng)建該抽象類子類的對象9創(chuàng)建抽象類的對象抽象類不可實(shí)例化9抽象類的使用例子publicclassCircleextendsShape{publicvoiddraw(){System.out.println("drawacircle....");}}TestShape.javapublicstaticvoidmain(String[]args){//Shapeshape=newShape();//errorShapeshape=newCircle();shape.draw();System.out.println(shape.getArea());}10抽象類的使用例子publicclassCircleex接口(interface)接口(interface)比抽象(abstract)的概念向前更邁進(jìn)了一步。你可以將它看作是“純粹的”抽象類。它允許類的創(chuàng)建者為一個(gè)類建立其形式:有方法名、參數(shù)列表和返回類型,但是沒有任何方法體。接口也可以包含有數(shù)據(jù)成員。接口只提供了形式,而未提供任何具體實(shí)現(xiàn)。接口是方法和常量值的定義的集合。11接口(interface)接口(interface)比抽象(接口的定義[修飾符]interface接口名[extends父接口名表]{[修飾符]域類型域名=常量值;//常量域聲明[修飾符]返回值方法名(參數(shù)表);//抽象方法聲明}

因?yàn)樗卸x在接口中的常量都默認(rèn)為public、static和final。所有定義在接口中的方法默認(rèn)為public和abstract,所以可以不用修飾符限定它們。和類不同的是,一個(gè)接口可以繼承多個(gè)父接口.12接口的定義[修飾符]interface接口名[extends接口例子publicinterfaceIShape{//面積doublearea=100.0;//畫出自己voiddraw();//得到面積doublegetArea();}13接口例子publicinterfaceIShape{13實(shí)現(xiàn)接口多個(gè)無關(guān)的類可實(shí)現(xiàn)同一個(gè)接口。一個(gè)類可實(shí)現(xiàn)多個(gè)無關(guān)的接口語法如下:<modifier>class<name>[extends<superclass>][implements<interface>[,<interface>]*]{<declarations>*}在Java中,可以通過接口來模擬多繼承14實(shí)現(xiàn)接口多個(gè)無關(guān)的類可實(shí)現(xiàn)同一個(gè)接口。14接口應(yīng)用例子publicclassCircleimplementsIShape{publicvoiddraw(){System.out.println("drawacircle....");}publicdoublegetArea(){//area=200.0;errorreturnarea;}}Main:IShapeshape=newCircle();shape.draw();System.out.println(shape.getArea());15接口應(yīng)用例子publicclassCircleimpl實(shí)現(xiàn)接口注意事項(xiàng)在類的聲明部分,用implements關(guān)鍵字聲明將要實(shí)現(xiàn)那些接口;如果實(shí)現(xiàn)某接口的類不是abstract類,則在類的定義部分必須實(shí)現(xiàn)指定接口的所有抽象方法,而且方法頭部分應(yīng)該與接口中的定義完全一致;如果實(shí)現(xiàn)某接口的類是abstract類,則它可以不實(shí)現(xiàn)該接口所有的方法。但其非abstract的子類中必須有所有抽象方法的實(shí)在的方法體;接口的抽象方法的訪問控制符都已指定為public,因此,類在實(shí)現(xiàn)方法時(shí),必須顯式地使用public修飾符。否則,將縮小接口定義方法的訪問控制范圍。(報(bào)錯(cuò))16實(shí)現(xiàn)接口注意事項(xiàng)在類的聲明部分,用implements關(guān)鍵字17生活中的接口電腦主板上的PCI插槽的規(guī)范就類似于Java接口聲卡顯卡網(wǎng)卡每種卡的內(nèi)部結(jié)構(gòu)都不相同,可以把聲卡、網(wǎng)卡、顯卡都插在PCI插槽上,而不用擔(dān)心哪個(gè)插槽是專門插哪個(gè)卡的主板17生活中的接口電腦主板上的PCI插槽的規(guī)范就類似于Java18什么是Java接口2-1一個(gè)Java接口是一些方法特征的集合,但沒有方法的實(shí)現(xiàn)publicinterfacePCI{

publicvoidstart();

publicvoidstop();

}classSoundCardimplementsPCI{publicvoidstart()

{

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

}

publicvoidstop()

{

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

}

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

{

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

}

publicvoidstop()

{

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

}

}聲卡、網(wǎng)卡都實(shí)現(xiàn)了PCI插槽的規(guī)范,但行為完全不同18什么是Java接口2-1一個(gè)Java接口是一些方法特征19什么是Java接口2-2publicclassAssembler{

publicstaticvoidmain(String[]args){

PCInc=newNetworkCard();

PCIsc=newSoundCard();

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

}

}可以使用Java接口標(biāo)識(shí)類型運(yùn)行時(shí),根據(jù)實(shí)際創(chuàng)建的對象類型調(diào)用相應(yīng)的方法實(shí)現(xiàn)Dudu...Send...控制臺(tái)輸出2119什么是Java接口2-2publicclassAs20為什么需要Java接口5-1為ACCP各中心開發(fā)這樣一個(gè)小系統(tǒng),包含類型:教員、中心、打印機(jī),具體要求如下:教員、以及中心都具有方法:輸出詳細(xì)信息中心具有屬性:打印機(jī),能夠通過中心的打印機(jī)打印教員或中心的詳細(xì)信息系統(tǒng)要具備良好的可擴(kuò)展性與可維護(hù)性打印教員中心教員

詳細(xì)信息中心

詳細(xì)信息detail方法(輸出詳細(xì)信息)20為什么需要Java接口5-1為ACCP各中心開發(fā)這樣一21為什么需要Java接口5-2以下這個(gè)解決方案中存在著什么問題?publicclassAccpTeacher1{//輸出教員的詳細(xì)信息publicStringdetail(){ return"本人是ACCP教員";}}publicclassAccpSchool1{privatePrinterprinter=newPrinter();//輸出中心的詳細(xì)信息publicStringdetail(){return"這里是ACCP中心";}//使用打印機(jī)打印教員信息publicvoidprint(AccpTeacher1t){printer.print(t.detail());}//使用打印機(jī)打印中心信息publicvoidprint(AccpSchool1s){ printer.print(s.detail());}}publicclassPrinter{publicvoidprint(Stringcontent){System.out.println("開始打?。?);System.out.println(content);}}每增加一種新類型,都需要增加相應(yīng)的print(類型名稱var)方法——程序的可擴(kuò)展性及可維護(hù)性極差——這不符合系統(tǒng)的要求21為什么需要Java接口5-2以下這個(gè)解決方案中存在著什22為什么需要Java接口5-3可以通過多態(tài)性解決這個(gè)問題嗎?顯然,本系統(tǒng)符合使用多態(tài)性的條件教員中心detail方法(負(fù)責(zé)輸出詳細(xì)信息)教員

詳細(xì)信息中心

詳細(xì)信息1221回顧多態(tài)的含義:實(shí)現(xiàn)同一個(gè)接口,使用不同的實(shí)例而執(zhí)行不同操作22為什么需要Java接口5-3可以通過多態(tài)性解決這個(gè)問題23為什么需要Java接口5-4在這個(gè)系統(tǒng)中,存在繼承關(guān)系嗎?教員、中心屬于兩種不同的類型,無法通過“is-a”找到一個(gè)合適的父類教員、中心都存在一個(gè)共同的方法特征:detail,它們對detail方法有各自不同的實(shí)現(xiàn)——這完全符合Java接口的定義定義一個(gè)Java接口,在其中定義detail方法,但沒有具體實(shí)現(xiàn)實(shí)現(xiàn)這個(gè)Java接口,不同的類對detail方法有不同的具體實(shí)現(xiàn)IntroduceableAccpTeacher2(教員)AccpSchool2(中心)23為什么需要Java接口5-4在這個(gè)系統(tǒng)中,存在繼承關(guān)系24為什么需要Java接口5-5publicinterfaceIntroduceable{publicStringdetail();}publicclassAccpSchool2

implementsIntroduceable{privatePrinterprinter=newPrinter();//輸出中心的詳細(xì)信息publicStringdetail(){return"這里是ACCP中心";}//使用中心打印機(jī)打印信息publicvoidprint(Introduceableintro){ printer.print(intro.detail());}}publicclassAccpTeacher2

implementsIntroduceable{//輸出教員的詳細(xì)信息publicStringdetail(){ return"本人是ACCP教員";}}通過Java接口,我們同樣可以享受到多態(tài)性的好處,大大提高了程序的可擴(kuò)展性及可維護(hù)性使用print方法時(shí),參數(shù)可以是任何Introduceable接口的實(shí)現(xiàn)類的對象,不必再為不同的類型建立不同的print方法了使用了Java接口之后,這個(gè)系統(tǒng)有了怎樣的改進(jìn)?24為什么需要Java接口5-5publicinterf25小結(jié)1為剛才完成的系統(tǒng)增加一種新的類型:學(xué)員(AccpStudent),具體要求如下:學(xué)員具有detail方法,負(fù)責(zé)輸出學(xué)員詳細(xì)信息能夠通過中心的打印機(jī)打印學(xué)員的詳細(xì)信息系統(tǒng)要具備良好的可擴(kuò)展性與可維護(hù)性編寫測試類StudentTest進(jìn)行測試,要求:通過中心的打印機(jī)打印學(xué)員的詳細(xì)信息StudentTest完整代碼實(shí)現(xiàn)AccpStudent完整代碼實(shí)現(xiàn)25小結(jié)1為剛才完成的系統(tǒng)增加一種新的類型:學(xué)員(Accp26什么是面向接口編程開發(fā)系統(tǒng)時(shí),主體構(gòu)架使用接口,接口構(gòu)成系統(tǒng)的骨架這樣就可以通過更換接口的實(shí)現(xiàn)類來更換系統(tǒng)的實(shí)現(xiàn)publicclassAccpSchool2implementsIntroduceable{privatePrinterprinter=newPrinter();publicStringdetail(){return"這里是ACCP中心";}//使用中心打印機(jī)打印信息publicvoidprint(Introduceableintro){ printer.print(intro.detail());}}IntroduceableAccpTeacher2(教員)AccpSchool2(中心)26什么是面向接口編程開發(fā)系統(tǒng)時(shí),主體構(gòu)架使用接口,接口構(gòu)成27面向接口編程的示例4-1升級(jí)上述的ACCP系統(tǒng),要求:打印機(jī)有多種類型,比如:黑白打印機(jī)、彩色打印機(jī)等中心可能配備其中任意一款打印機(jī),負(fù)責(zé)打印教員、或者中心的詳細(xì)信息系統(tǒng)要具備良好的可擴(kuò)展性與可維護(hù)性print方法(打?。┎噬蛴C(jī)黑白打印機(jī)黑白內(nèi)容中心/教員詳細(xì)信息彩色內(nèi)容27面向接口編程的示例4-1升級(jí)上述的ACCP系統(tǒng),要求:28面向接口編程的示例4-2采用面向接口編程的方式實(shí)現(xiàn),以下是三個(gè)步驟中的第一步:抽象出Java接口1、分析:黑白、彩色打印機(jī)都存在一個(gè)共同的方法特征:print黑白、彩色打印機(jī)對print方法有各自不同的實(shí)現(xiàn)2、結(jié)論:抽象出Java接口PrinterFace,在其中定義方法print3、具體實(shí)現(xiàn):publicinterfacePrinterFace{publicvoid

print(Stringcontent);}28面向接口編程的示例4-2采用面向接口編程的方式實(shí)現(xiàn),以29面向接口編程的示例4-3采用面向接口編程的方式實(shí)現(xiàn),以下是三個(gè)步驟中的第二步:publicclassColorPrinter

implementsPrinterFace{publicvoid

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

implementsPrinterFace{publicvoid

print(Stringcontent){System.out.println("黑白打?。?);System.out.println(content);}}實(shí)現(xiàn)Java接口1、分析:已經(jīng)抽象出Java接口PrinterFace,并在其中定義了print方法黑白、彩色打印機(jī)對print方法有各自不同的實(shí)現(xiàn)2、結(jié)論:黑白、彩色打印機(jī)都實(shí)現(xiàn)PrinterFace接口,各自實(shí)現(xiàn)print方法3、具體實(shí)現(xiàn):29面向接口編程的示例4-3采用面向接口編程的方式實(shí)現(xiàn),以30面向接口編程的示例4-4采用面向接口編程的方式實(shí)現(xiàn),以下是三個(gè)步驟中的第三步:使用Java接口1、分析:主體構(gòu)架使用接口,讓接口構(gòu)成系統(tǒng)的骨架2、結(jié)論:更換實(shí)現(xiàn)接口的類就可以更換系統(tǒng)的實(shí)現(xiàn)3、具體實(shí)現(xiàn):publicclassAccpSchool3implementsIntroduceable{privatePrinterFaceprinter;//打印機(jī)

publicvoidsetPrinter(PrinterFacep){this.printer=p;}publicStringdetail(){return"這里是ACCP中心";}publicvoidprint(Introduceableintro){

printer.print(intro.detail());}}publicclassAccpTest{publicstaticvoidmain(String[]args){//創(chuàng)建中心實(shí)例

AccpSchool3school=newAccpSchool3();//為該中心配備黑白打印機(jī)

school.setPrinter(newBlackPrinter());school.print(school);//為該中心配備彩色打印機(jī)

school.setPrinter(new

ColorPrinter());school.print(school);}}30面向接口編程的示例4-4采用面向接口編程的方式實(shí)現(xiàn),以31小結(jié)2閱讀如下Java代碼,然后請采用面向接口編程的思想,在空白處填寫正確的代碼publicinterfacePCI{

void

start();

void

stop();

}classSoundCardimplementsPCI{publicvoidstart()

{

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

}

publicvoidstop()

{

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

}

}classNetworkCardimplementsPCI{publicvoidstart()

{

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

}

publicvoidstop()

{

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

}

}這是Java接口,相當(dāng)于主板上的PCI插槽的規(guī)范聲卡、網(wǎng)卡都實(shí)現(xiàn)了PCI插槽的規(guī)范,但行為完全不同31小結(jié)2閱讀如下Java代碼,然后請采用面向接口編程的思32小結(jié)2publicclassMainBoard{

publicvoidusePCICard(______p)

{

p.start();

p.stop();

}

}publicclassAssembler{

publicstaticvoidmain(String[]args)

{

MainBoardmb=newMainBoard();

//在主板上插入網(wǎng)卡

//在主板上插入聲卡

}

}提示:通過這個(gè)方法,主板上可以插入任意符合PCI插槽規(guī)范的卡PCInc=newNetworkCard();mb.usePCICard(nc);

PCIsc=newSoundCard();

mb.usePCICard(sc);PCI提示:可以通過更換實(shí)現(xiàn)接口的類來更換系統(tǒng)的實(shí)現(xiàn)32小結(jié)2publicclassMainBoard{

33為什么需要常量生活中,一周有七天,如何用代碼表示?publicclassWeek{privateintdays=7;publicstaticvoidmain(String[]args){Weekw=newWeek();System.out.println("一周有"+w.days+"天");}}publicclassWeek{privateintdays=7;publicstaticvoidmain(String[]args){Weekw=newWeek();w.days++;System.out.println("一周有"+w.days+"天");}}一周有7天控制臺(tái)輸出然而,總有不盡人意的事情發(fā)生:一周有8天控制臺(tái)輸出如何保證變量的值在運(yùn)行期無法被改變?——使用常量33為什么需要常量生活中,一周有七天,如何用代碼表示?pub34什么是常量常量是一種標(biāo)識(shí)符,它的值在運(yùn)行期間恒定不變常量標(biāo)識(shí)符在程序中只能被引用,而不能被重新賦值常量圓周率PI圓周率PI代碼表示方式publicstaticfinaldoublePI

=3.14159265358979323846;用法將ang角度轉(zhuǎn)換成徑度publicstaticdoubletoRadians(doubleang){returnang/180.0*PI;}34什么是常量常量是一種標(biāo)識(shí)符,它的值在運(yùn)行期間恒定不變常量35常量的優(yōu)點(diǎn)如果不使用常量,直接在程序中填寫數(shù)字或字符串,將會(huì)有什么麻煩?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ù)值改變,則需要在很多地方改動(dòng),既麻煩又易出錯(cuò)使用常量可以增強(qiáng)程序的可讀性、可維護(hù)性35常量的優(yōu)點(diǎn)如果不使用常量,直接在程序中填寫數(shù)字或字符串,36Java中常量的定義規(guī)則加入final關(guān)鍵字代表常量,加入static關(guān)鍵字代表類變量盡量使用含義直觀的常量來表示那些將在程序中多次出現(xiàn)的數(shù)字或字符串publicclassAccpStudent{publicstaticfinalintFEMALE=1;//代表女性publicstaticfinalintMALE=2;//代表男性privateintsex;//性別publicvoidsetSex(intsex){if(sex==FEMALE) System.out.println("這是一名女學(xué)生");elseif(sex==MALE) System.out.println("這是一名男學(xué)生");this.sex=sex;}}36Java中常量的定義規(guī)則加入final關(guān)鍵字代表常量,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論