Java程序設(shè)計教程課件_第1頁
Java程序設(shè)計教程課件_第2頁
Java程序設(shè)計教程課件_第3頁
Java程序設(shè)計教程課件_第4頁
Java程序設(shè)計教程課件_第5頁
已閱讀5頁,還剩43頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

人民郵電出版社7接口、Lambda表達(dá)式和枚舉第章導(dǎo)讀Introduction接口,是java提供的一個重要的類型,是對抽象類的進(jìn)一步抽象。通過接口的繼承和接口回調(diào)技術(shù),可以實(shí)現(xiàn)“多重繼承”,并實(shí)現(xiàn)“行為”上的多態(tài)。

Lambda表達(dá)式是一種提高編程效率的表達(dá)形式,配合函數(shù)式接口或匿名類可以使得程序代碼更加簡潔明了。枚舉可以將對象的所有值一一列舉出來,提高程序的可讀性和健壯性。C目錄ONTENTS7.2

實(shí)現(xiàn)接口7.3接口與多態(tài)7.4接口的設(shè)計與使用7.5

接口的功能擴(kuò)展7.6Lambda表達(dá)式7.1接口7.7枚舉7.8小結(jié)1、接口的概念Java接口是由若干常量和方法聲明組成的集合。接口中的方法只有聲明沒有實(shí)現(xiàn)。這些方法可以在不同的地方被不同的類實(shí)現(xiàn),而這些實(shí)現(xiàn)可以具有不同的行為(功能)。定義接口的目的在于規(guī)范對象的行為,告訴接口的實(shí)現(xiàn)者必須做什么,但不要求怎么做,由實(shí)現(xiàn)者根據(jù)自身情況決定怎么做。接口中定義的常量是接口的特征屬性,用于規(guī)范接口要求。7.1.1接口的概念與定義2、接口的定義格式如下:[修飾符]interface接口名稱[extends父接口名列表]{[public][static][final]數(shù)據(jù)類型變量名=常量值;[public][abstract]返回值類型方法名(參數(shù)列表);}7.1.1接口的概念與定義publicinterfaceCubage{ publicstaticfinaldoublePI=3.1415926;publicabstractdoubledoCubage();}2、接口的定義7.1.1接口的概念與定義例如,定義一個接口Cubage,實(shí)現(xiàn)計算物體的體積。1、語法上的不同7.1.2接口與abstract類(1)抽象類中既可以包含抽象方法,也可以包含非抽象的普通方法;而接口中所有的方法必須是抽象方法;(2)抽象類中的抽象方法的訪問類型可以是public,protected和默認(rèn)類型,但接口中的抽象方法只能是public類型的;(3)抽象類中可以有普通成員變量,而接口中的所有變量均為publicstaticfinal修飾,即均為常量;(4)抽象類里可以有構(gòu)造方法,而接口內(nèi)不能有構(gòu)造方法;(5)一個類可以實(shí)現(xiàn)多個接口,但只能繼承一個抽象類。C目錄ONTENTS7.2

實(shí)現(xiàn)接口7.3接口與多態(tài)7.4接口的設(shè)計與使用7.5

接口的功能擴(kuò)展7.6Lambda表達(dá)式7.1接口7.7枚舉7.8小結(jié)7.2.1用類實(shí)現(xiàn)接口[修飾符]class類名[extends父類名][implements接口A,接口B,···]{類成員變量和成員方法;為接口A中的所有方法編寫方法體,實(shí)現(xiàn)接口A;為接口B中的所有方法編寫方法體,實(shí)現(xiàn)接口B;}格式:如果一個非抽象類實(shí)現(xiàn)了某個接口,那么這個類就要重寫接口中的所有方法。接口中的方法均用publicabstract修飾,所以在類重寫這些方法時也一定要用public進(jìn)行修飾?!纠?.1】定義接口并實(shí)現(xiàn)接口計算圓柱和圓錐的體積。

Example7_1.java7.2.2定義接口中的方法C目錄ONTENTS7.2

實(shí)現(xiàn)接口7.3接口與多態(tài)7.4接口的設(shè)計與使用7.5

接口的功能擴(kuò)展7.6Lambda表達(dá)式7.1接口7.7枚舉7.8小結(jié)7.3.1接口中多態(tài)的概念接口多態(tài)是指不同的類在實(shí)現(xiàn)同一個接口時具有不同的實(shí)現(xiàn)過程,當(dāng)接口變量進(jìn)行回調(diào)接口方法時就具有多種不同的形態(tài)。實(shí)現(xiàn)接口的多態(tài)性通常會使用到Java的接口回調(diào)技術(shù)。接口回調(diào)本質(zhì)上與繼承中的上轉(zhuǎn)型相同,不同之處是,接口回調(diào)是用接口句柄來獲得并調(diào)用實(shí)現(xiàn)這個接口的子類的引用,而上轉(zhuǎn)型是用父類句柄來獲得并調(diào)用實(shí)現(xiàn)此父類的子類的引用。7.3.2通過接口實(shí)現(xiàn)多態(tài)在接口定義時,將不同類的相同行為抽象出來成為接口,每個類對接口中的方法給出具體的行為實(shí)現(xiàn)。當(dāng)通過接口句柄調(diào)用方法時,系統(tǒng)會根據(jù)具體的子類對象決定執(zhí)行哪個類中相應(yīng)的方法,從而實(shí)現(xiàn)行為多態(tài)?!締栴}分析】根據(jù)問題描述,可以確定有員工、臺燈和計算機(jī)三個類。它們之間的相互關(guān)系是員工使用臺燈和計算機(jī),產(chǎn)生的行為是開、關(guān)臺燈和計算機(jī),并且這個行為對臺燈和計算機(jī)產(chǎn)生的結(jié)果不相同,燈是打開、熄滅,計算機(jī)是啟動系統(tǒng)、關(guān)閉系統(tǒng)。臺燈和計算機(jī)都要有開、關(guān)行為,然而,這兩類完全不同,因此將開、關(guān)行為抽象成接口來實(shí)現(xiàn)。7.3.2通過接口實(shí)現(xiàn)多態(tài)【例7.2】一個公司的員工,每天上班后打開桌上的工作燈,打開電腦開始工作。下班前,關(guān)閉計算機(jī)和臺燈,然后下班。請進(jìn)行編程描述這一過程。Example7_02.javaC目錄ONTENTS7.2

實(shí)現(xiàn)接口7.3接口與多態(tài)7.4接口的設(shè)計與使用7.5

接口的功能擴(kuò)展7.6Lambda表達(dá)式7.1接口7.7枚舉7.8小結(jié)接口主要是對不同類型的對象所具有的相同行為進(jìn)行統(tǒng)一和規(guī)范,重點(diǎn)在于“行為”,而與類型無關(guān),所以更適于功能擴(kuò)展。7.4接口的設(shè)計與使用【問題分析】根據(jù)題意,首先定義一個USB接口,然后定義若干個USB設(shè)備實(shí)現(xiàn)USB接口的讀寫功能。最后,通過一個帶有USB接口的計算機(jī)對象完成USB設(shè)備的接入、讀寫、移除等操作?!纠?.3】編寫程序,模擬計算機(jī)使用USB設(shè)備的過程。

Example7_03.java7.4接口的設(shè)計與使用C目錄ONTENTS7.2

實(shí)現(xiàn)接口7.3接口與多態(tài)7.4接口的設(shè)計與使用7.5

接口的功能擴(kuò)展7.6Lambda表達(dá)式7.1接口7.7枚舉7.8小結(jié)從Java8開始,接口里允許定義默認(rèn)方法,解決接口功能增加的問題。即接口的繼承類不需要重寫接口中新增的方法,就可以直接使用新功能。格式如下:[public]default返回值類型方法名稱(參數(shù)列表){…….//方法體}7.5.1默認(rèn)方法默認(rèn)方法的定義使用default進(jìn)行修飾,并且有了方法體。接口在進(jìn)行功能擴(kuò)展時,可以根據(jù)需要增加若干個默認(rèn)方法。繼承接口的子類既可以直接繼承并使用該默認(rèn)方法,也可以重寫覆蓋該默認(rèn)方法,從而使得接口的定義和使用更為靈活、方便。7.5.1默認(rèn)方法【問題分析】根據(jù)題意,在原有的USB接口上增加充電的功能。以往處理方法:在USB接口定義中增加一個抽象方法publicabstractvoiddoCharge(),然后對所有繼承該接口的子類進(jìn)行方法重寫,以保證程序的正確運(yùn)行。缺點(diǎn):導(dǎo)致大量的代碼修改,不僅費(fèi)事費(fèi)力,還容易導(dǎo)致代碼錯誤?,F(xiàn)在可以利用默認(rèn)方法來實(shí)現(xiàn)這一功能。優(yōu)點(diǎn):繼承該接口的子類無需任何更改即可以根據(jù)需要直接使用這個功能。Example7_04.java【例7.4】基于例7.3,增加USB接口功能:USB接口充電

7.5.1默認(rèn)方法從Java8開始,接口里也允許定義靜態(tài)方法,可以直接通過接口名進(jìn)行調(diào)用。格式如下:[public]static返回值類型方法名稱(參數(shù)列表){…….//方法體}7.5.2靜態(tài)方法靜態(tài)方法的定義使用static進(jìn)行修飾,并且也有方法體,在定義該方法的同時就可以直接給出方法的實(shí)現(xiàn)內(nèi)容。7.5.2靜態(tài)方法靜態(tài)方法特點(diǎn):接口的靜態(tài)方法定義和使用與類的靜態(tài)方法基本一樣,在調(diào)用時只能通過接口名進(jìn)行調(diào)用,而不能使用子類名或子類對象進(jìn)行調(diào)用?!纠?.5】靜態(tài)方法應(yīng)用舉例。Example7_05.java

7.5.2靜態(tài)方法從Java9開始,接口里增加私有方法,實(shí)現(xiàn)默認(rèn)方法或靜態(tài)方法中的代碼共享。格式如下:格式1:private返回值類型方法名稱(參數(shù)列表){…//方法體}7.5.3私有方法格式2:privatestatic返回值類型方法名稱(參數(shù)列表){…//方法體}私有方法的定義包括普通私有方法和靜態(tài)私有方法兩種格式。分別用于默認(rèn)方法和靜態(tài)方法中。靜態(tài)方法中只能調(diào)用靜態(tài)私有方法。默認(rèn)方法中兩者都可調(diào)用。7.5.3私有方法【例7.6】私有方法應(yīng)用舉例。Example7_06.java

7.5.3私有方法7.5.4接口多重繼承沖突的處理1.相同的抽象方法:子類繼承時必須重寫并且只需重寫一個抽象方法即可。2.相同的默認(rèn)方法:子類繼承時必須重寫,如果想引用父接口的默認(rèn)方法,則可以通過:接口名.super.方法名()的形式進(jìn)行調(diào)用。3.相同的靜態(tài)方法:靜態(tài)方法只跟接口有關(guān),所以靜態(tài)方法重名在使用中沒有任何影響。在多重繼承時出現(xiàn)不同接口中的相同方法,按照給定規(guī)則進(jìn)行繼承和重寫C目錄ONTENTS7.2

實(shí)現(xiàn)接口7.3接口與多態(tài)7.4接口的設(shè)計與使用7.5

接口的功能擴(kuò)展7.6Lambda表達(dá)式7.1接口7.7枚舉7.8小結(jié)1、什么是Lambda表達(dá)式Lambda表達(dá)式,是一個匿名方法的實(shí)現(xiàn)形式。本質(zhì)是一種把方法作為參數(shù)進(jìn)行傳遞的編程思想。利用Lambda表達(dá)式,可以精簡程序的代碼量,使程序更加簡潔明了,也減少了程序員的工作量。

Java語言在版本8中引入了這種表達(dá)式。7.6.1Lambda表達(dá)式的概念和語法2、語法格式格式如下:

([參數(shù)])->{語句;}說明:Lambda表達(dá)式主要分為3個部分:“()”是聲明的參數(shù),各參數(shù)用逗號進(jìn)行間隔;箭頭符號“->”是正則表達(dá)式的操作符,表示將參數(shù)內(nèi)容傳到后面的語句中;“{}”中就是實(shí)現(xiàn)功能的代碼塊,是整個表達(dá)式的主體。7.6.1Lambda表達(dá)式的概念和語法用Lambda表達(dá)式實(shí)現(xiàn)的形式為:(intx,inty)->{intz=x+y;returnz;}2、語法格式7.6.1Lambda表達(dá)式的概念和語法例如,定義一個方法intadd(intx,inty);來計算兩個整數(shù)的和3、Lambda表達(dá)式的簡略規(guī)則可選類型聲明:定義參數(shù)時不需要聲明參數(shù)類型,編譯時系統(tǒng)會自動根據(jù)上下文推斷數(shù)據(jù)類型。可選的參數(shù)圓括號:只有一個參數(shù)時可以省略圓括號,但有多個參數(shù)時需要定義圓括號。可選的大括號:如果主體中只有一個語句,可以省略大括號??蛇x的return關(guān)鍵字:如果主體中只有一個表達(dá)式可以省略return語句,在大括號中需要有一個return語句。7.6.1Lambda表達(dá)式的概念和語法上例可簡寫為:(x,y)->x+y【問題分析】:根據(jù)題意,顯然不是重新進(jìn)行類定義,而是想在以后的應(yīng)用中根據(jù)需要使用到這個接口功能。方法1:采用前面所學(xué)習(xí)的匿名類的方式加以處理,在生成實(shí)例時重寫其中的方法來實(shí)現(xiàn)。方法2:接口中只有一個抽象方法,則可以用Lambda表達(dá)式來實(shí)現(xiàn),使得代碼更加簡潔。Example7_07.java【例7.7】參考例7.1,如果一個類(Cone)在定義時沒有繼承這個接口,在后續(xù)的應(yīng)用中如何實(shí)現(xiàn)這個接口功能(方法)呢?

7.6.1Lambda表達(dá)式的概念和語法例7.7說明:在本程序代碼中,給出了三種不同的接口實(shí)現(xiàn)方式。方式1是傳統(tǒng)的實(shí)現(xiàn)方法,即在方法定義時直接繼承接口并重寫方法。方式2采用了匿名類的形式實(shí)現(xiàn),在用new生成實(shí)例的同時給出方法體。方式3則采用了Lambda表達(dá)式的形式實(shí)現(xiàn)接口。7.6.1Lambda表達(dá)式的概念和語法該Lambda表達(dá)式語句的完整寫法:Cubage<Cone>cubage1=(Conecone)->{doubleresult;result=Cubage.PI*cone.getH()*cone.getR()*cone.getR()/3;returnresult;};4、Lambda表達(dá)式的方法引用方法引用是用來直接訪問類或者實(shí)例的已經(jīng)存在的方法或者構(gòu)造方法。如果抽象方法的實(shí)現(xiàn)恰好可以通過調(diào)用另外一個方法來實(shí)現(xiàn),就可以使用方法引用。7.6.1Lambda表達(dá)式的概念和語法類型Lambda表達(dá)式引用語法構(gòu)造方法引用(p)->new類名(p)類名::new實(shí)例方法引用(p)->instance.instanceMethod(p)instance::instanceMethod對象方法引用(instance,p)->類名.instanceMethod(p)類名::instMethod靜態(tài)方法引用(p)->類名.staticMethod(p)類名::staticMethod常用的方法引用類型及語法1、函數(shù)式接口的定義所謂函數(shù)式接口,是指在接口定義中,只有一個待重寫的抽象方法。在例7.1中定義的Cubage接口就屬于函數(shù)式接口,其內(nèi)部只有一個抽象方法doCubage()。函數(shù)式接口中的抽象方法是指自身只能定義一個抽象方法,不包括從父類繼承下來的方法。7.6.2函數(shù)式接口2、@FunctionalInterface注解在接口定義前加上一個@FunctionalInterface注解,表明該接口是一個函數(shù)式接口。系統(tǒng)會自動檢查該接口定義是否符合函數(shù)式接口規(guī)范。函數(shù)式接口只是限制了抽象方法只能有一個,對于其他的方法定義,如默認(rèn)方法、靜態(tài)方法等沒有約束。7.6.2函數(shù)式接口3、常用的函數(shù)式接口(基本都在java.util.function包中)7.6.2函數(shù)式接口Runnable接口在java.lang包中,Comparator接口在java.util包中。函數(shù)式接口抽象方法函數(shù)描述符說明Runnablevoidrun()()->void啟動一個線程,運(yùn)行run()方法中的代碼Comparator<T>intcompare(To1,To2)(o1,o2)->int比較兩個參數(shù)的順序,返回負(fù)整數(shù),零或正整數(shù)Predicate<T>booleantest(T)(T)

->boolean判斷是否滿足條件,常用于篩選元素Consumer<T>voidaccept(T)(T)

->void消費(fèi)者接口,完成一個對象操作,無需返回值Supplier<T>Tget()()

->T生產(chǎn)者接口,獲取指定的結(jié)果Function<T,R>Rapply(T)(T)

->R函數(shù)形式,一個輸入,產(chǎn)生一個輸出結(jié)果【問題分析】根據(jù)題意,可以利用Java語言提供的比較器Comparator<T>,通過java.util包中的數(shù)組封裝類Arrays.sort()方法實(shí)現(xiàn)自動排序。本題目中是對員工對象進(jìn)行排序,需要我們自己定義排序規(guī)則,比較器Comparator<T>就可以實(shí)現(xiàn)這個功能。并且該比較器也是一個函數(shù)式接口,所以也可以Lambda表達(dá)式的形式實(shí)現(xiàn)。Example7_08.java【例7.8】現(xiàn)有一個公司的員工列表,請按給定要求排序后輸出員工信息:按年齡從大到小排序,如果年齡相同則按員工號從小到大排序。

7.6.2函數(shù)式接口C目錄ONTENTS7.2

實(shí)現(xiàn)接口7.3接口與多態(tài)7.4接口的設(shè)計與使用7.5

接口的功能擴(kuò)展7.6Lambda表達(dá)式7.1接口7.7枚舉7.8小結(jié)如果一個對象的所有值可以一一列舉出來,則稱為枚舉。在Java中,枚舉類型也是一個類,用枚舉類的變量表示枚舉值。Java定義了一個基礎(chǔ)枚舉類Enum,任何枚舉類都是這個類的子類。使用枚舉可以提高程序的清晰性和可讀性。7.7枚舉7.7.1簡單的枚舉類enum枚舉名{枚舉常量表列}定義枚舉類后,就可以定義枚舉變量了。枚舉變量的定義形式:枚舉名枚舉變量表列;定義的語法形式:【例7.9】顯示一個星期中每一天的工作效率。Example7_09.java枚

溫馨提示

  • 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

提交評論