




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
人民郵電出版社7接口、Lambda表達式和枚舉第章導讀Introduction接口,是java提供的一個重要的類型,是對抽象類的進一步抽象。通過接口的繼承和接口回調技術,可以實現(xiàn)“多重繼承”,并實現(xiàn)“行為”上的多態(tài)。
Lambda表達式是一種提高編程效率的表達形式,配合函數(shù)式接口或匿名類可以使得程序代碼更加簡潔明了。枚舉可以將對象的所有值一一列舉出來,提高程序的可讀性和健壯性。C目錄ONTENTS7.2
實現(xiàn)接口7.3接口與多態(tài)7.4接口的設計與使用7.5
接口的功能擴展7.6Lambda表達式7.1接口7.7枚舉7.8小結1、接口的概念Java接口是由若干常量和方法聲明組成的集合。接口中的方法只有聲明沒有實現(xiàn)。這些方法可以在不同的地方被不同的類實現(xiàn),而這些實現(xiàn)可以具有不同的行為(功能)。定義接口的目的在于規(guī)范對象的行為,告訴接口的實現(xiàn)者必須做什么,但不要求怎么做,由實現(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,實現(xiàn)計算物體的體積。1、語法上的不同7.1.2接口與abstract類(1)抽象類中既可以包含抽象方法,也可以包含非抽象的普通方法;而接口中所有的方法必須是抽象方法;(2)抽象類中的抽象方法的訪問類型可以是public,protected和默認類型,但接口中的抽象方法只能是public類型的;(3)抽象類中可以有普通成員變量,而接口中的所有變量均為publicstaticfinal修飾,即均為常量;(4)抽象類里可以有構造方法,而接口內不能有構造方法;(5)一個類可以實現(xiàn)多個接口,但只能繼承一個抽象類。C目錄ONTENTS7.2
實現(xiàn)接口7.3接口與多態(tài)7.4接口的設計與使用7.5
接口的功能擴展7.6Lambda表達式7.1接口7.7枚舉7.8小結7.2.1用類實現(xiàn)接口[修飾符]class類名[extends父類名][implements接口A,接口B,···]{類成員變量和成員方法;為接口A中的所有方法編寫方法體,實現(xiàn)接口A;為接口B中的所有方法編寫方法體,實現(xiàn)接口B;}格式:如果一個非抽象類實現(xiàn)了某個接口,那么這個類就要重寫接口中的所有方法。接口中的方法均用publicabstract修飾,所以在類重寫這些方法時也一定要用public進行修飾?!纠?.1】定義接口并實現(xiàn)接口計算圓柱和圓錐的體積。
Example7_1.java7.2.2定義接口中的方法C目錄ONTENTS7.2
實現(xiàn)接口7.3接口與多態(tài)7.4接口的設計與使用7.5
接口的功能擴展7.6Lambda表達式7.1接口7.7枚舉7.8小結7.3.1接口中多態(tài)的概念接口多態(tài)是指不同的類在實現(xiàn)同一個接口時具有不同的實現(xiàn)過程,當接口變量進行回調接口方法時就具有多種不同的形態(tài)。實現(xiàn)接口的多態(tài)性通常會使用到Java的接口回調技術。接口回調本質上與繼承中的上轉型相同,不同之處是,接口回調是用接口句柄來獲得并調用實現(xiàn)這個接口的子類的引用,而上轉型是用父類句柄來獲得并調用實現(xiàn)此父類的子類的引用。7.3.2通過接口實現(xiàn)多態(tài)在接口定義時,將不同類的相同行為抽象出來成為接口,每個類對接口中的方法給出具體的行為實現(xiàn)。當通過接口句柄調用方法時,系統(tǒng)會根據(jù)具體的子類對象決定執(zhí)行哪個類中相應的方法,從而實現(xiàn)行為多態(tài)。【問題分析】根據(jù)問題描述,可以確定有員工、臺燈和計算機三個類。它們之間的相互關系是員工使用臺燈和計算機,產生的行為是開、關臺燈和計算機,并且這個行為對臺燈和計算機產生的結果不相同,燈是打開、熄滅,計算機是啟動系統(tǒng)、關閉系統(tǒng)。臺燈和計算機都要有開、關行為,然而,這兩類完全不同,因此將開、關行為抽象成接口來實現(xiàn)。7.3.2通過接口實現(xiàn)多態(tài)【例7.2】一個公司的員工,每天上班后打開桌上的工作燈,打開電腦開始工作。下班前,關閉計算機和臺燈,然后下班。請進行編程描述這一過程。Example7_02.javaC目錄ONTENTS7.2
實現(xiàn)接口7.3接口與多態(tài)7.4接口的設計與使用7.5
接口的功能擴展7.6Lambda表達式7.1接口7.7枚舉7.8小結接口主要是對不同類型的對象所具有的相同行為進行統(tǒng)一和規(guī)范,重點在于“行為”,而與類型無關,所以更適于功能擴展。7.4接口的設計與使用【問題分析】根據(jù)題意,首先定義一個USB接口,然后定義若干個USB設備實現(xiàn)USB接口的讀寫功能。最后,通過一個帶有USB接口的計算機對象完成USB設備的接入、讀寫、移除等操作?!纠?.3】編寫程序,模擬計算機使用USB設備的過程。
Example7_03.java7.4接口的設計與使用C目錄ONTENTS7.2
實現(xiàn)接口7.3接口與多態(tài)7.4接口的設計與使用7.5
接口的功能擴展7.6Lambda表達式7.1接口7.7枚舉7.8小結從Java8開始,接口里允許定義默認方法,解決接口功能增加的問題。即接口的繼承類不需要重寫接口中新增的方法,就可以直接使用新功能。格式如下:[public]default返回值類型方法名稱(參數(shù)列表){…….//方法體}7.5.1默認方法默認方法的定義使用default進行修飾,并且有了方法體。接口在進行功能擴展時,可以根據(jù)需要增加若干個默認方法。繼承接口的子類既可以直接繼承并使用該默認方法,也可以重寫覆蓋該默認方法,從而使得接口的定義和使用更為靈活、方便。7.5.1默認方法【問題分析】根據(jù)題意,在原有的USB接口上增加充電的功能。以往處理方法:在USB接口定義中增加一個抽象方法publicabstractvoiddoCharge(),然后對所有繼承該接口的子類進行方法重寫,以保證程序的正確運行。缺點:導致大量的代碼修改,不僅費事費力,還容易導致代碼錯誤?,F(xiàn)在可以利用默認方法來實現(xiàn)這一功能。優(yōu)點:繼承該接口的子類無需任何更改即可以根據(jù)需要直接使用這個功能。Example7_04.java【例7.4】基于例7.3,增加USB接口功能:USB接口充電
7.5.1默認方法從Java8開始,接口里也允許定義靜態(tài)方法,可以直接通過接口名進行調用。格式如下:[public]static返回值類型方法名稱(參數(shù)列表){…….//方法體}7.5.2靜態(tài)方法靜態(tài)方法的定義使用static進行修飾,并且也有方法體,在定義該方法的同時就可以直接給出方法的實現(xiàn)內容。7.5.2靜態(tài)方法靜態(tài)方法特點:接口的靜態(tài)方法定義和使用與類的靜態(tài)方法基本一樣,在調用時只能通過接口名進行調用,而不能使用子類名或子類對象進行調用。【例7.5】靜態(tài)方法應用舉例。Example7_05.java
7.5.2靜態(tài)方法從Java9開始,接口里增加私有方法,實現(xiàn)默認方法或靜態(tài)方法中的代碼共享。格式如下:格式1:private返回值類型方法名稱(參數(shù)列表){…//方法體}7.5.3私有方法格式2:privatestatic返回值類型方法名稱(參數(shù)列表){…//方法體}私有方法的定義包括普通私有方法和靜態(tài)私有方法兩種格式。分別用于默認方法和靜態(tài)方法中。靜態(tài)方法中只能調用靜態(tài)私有方法。默認方法中兩者都可調用。7.5.3私有方法【例7.6】私有方法應用舉例。Example7_06.java
7.5.3私有方法7.5.4接口多重繼承沖突的處理1.相同的抽象方法:子類繼承時必須重寫并且只需重寫一個抽象方法即可。2.相同的默認方法:子類繼承時必須重寫,如果想引用父接口的默認方法,則可以通過:接口名.super.方法名()的形式進行調用。3.相同的靜態(tài)方法:靜態(tài)方法只跟接口有關,所以靜態(tài)方法重名在使用中沒有任何影響。在多重繼承時出現(xiàn)不同接口中的相同方法,按照給定規(guī)則進行繼承和重寫C目錄ONTENTS7.2
實現(xiàn)接口7.3接口與多態(tài)7.4接口的設計與使用7.5
接口的功能擴展7.6Lambda表達式7.1接口7.7枚舉7.8小結1、什么是Lambda表達式Lambda表達式,是一個匿名方法的實現(xiàn)形式。本質是一種把方法作為參數(shù)進行傳遞的編程思想。利用Lambda表達式,可以精簡程序的代碼量,使程序更加簡潔明了,也減少了程序員的工作量。
Java語言在版本8中引入了這種表達式。7.6.1Lambda表達式的概念和語法2、語法格式格式如下:
([參數(shù)])->{語句;}說明:Lambda表達式主要分為3個部分:“()”是聲明的參數(shù),各參數(shù)用逗號進行間隔;箭頭符號“->”是正則表達式的操作符,表示將參數(shù)內容傳到后面的語句中;“{}”中就是實現(xiàn)功能的代碼塊,是整個表達式的主體。7.6.1Lambda表達式的概念和語法用Lambda表達式實現(xiàn)的形式為:(intx,inty)->{intz=x+y;returnz;}2、語法格式7.6.1Lambda表達式的概念和語法例如,定義一個方法intadd(intx,inty);來計算兩個整數(shù)的和3、Lambda表達式的簡略規(guī)則可選類型聲明:定義參數(shù)時不需要聲明參數(shù)類型,編譯時系統(tǒng)會自動根據(jù)上下文推斷數(shù)據(jù)類型。可選的參數(shù)圓括號:只有一個參數(shù)時可以省略圓括號,但有多個參數(shù)時需要定義圓括號。可選的大括號:如果主體中只有一個語句,可以省略大括號??蛇x的return關鍵字:如果主體中只有一個表達式可以省略return語句,在大括號中需要有一個return語句。7.6.1Lambda表達式的概念和語法上例可簡寫為:(x,y)->x+y【問題分析】:根據(jù)題意,顯然不是重新進行類定義,而是想在以后的應用中根據(jù)需要使用到這個接口功能。方法1:采用前面所學習的匿名類的方式加以處理,在生成實例時重寫其中的方法來實現(xiàn)。方法2:接口中只有一個抽象方法,則可以用Lambda表達式來實現(xiàn),使得代碼更加簡潔。Example7_07.java【例7.7】參考例7.1,如果一個類(Cone)在定義時沒有繼承這個接口,在后續(xù)的應用中如何實現(xiàn)這個接口功能(方法)呢?
7.6.1Lambda表達式的概念和語法例7.7說明:在本程序代碼中,給出了三種不同的接口實現(xiàn)方式。方式1是傳統(tǒng)的實現(xiàn)方法,即在方法定義時直接繼承接口并重寫方法。方式2采用了匿名類的形式實現(xiàn),在用new生成實例的同時給出方法體。方式3則采用了Lambda表達式的形式實現(xiàn)接口。7.6.1Lambda表達式的概念和語法該Lambda表達式語句的完整寫法:Cubage<Cone>cubage1=(Conecone)->{doubleresult;result=Cubage.PI*cone.getH()*cone.getR()*cone.getR()/3;returnresult;};4、Lambda表達式的方法引用方法引用是用來直接訪問類或者實例的已經存在的方法或者構造方法。如果抽象方法的實現(xiàn)恰好可以通過調用另外一個方法來實現(xiàn),就可以使用方法引用。7.6.1Lambda表達式的概念和語法類型Lambda表達式引用語法構造方法引用(p)->new類名(p)類名::new實例方法引用(p)->instance.instanceMethod(p)instance::instanceMethod對象方法引用(instance,p)->類名.instanceMethod(p)類名::instMethod靜態(tài)方法引用(p)->類名.staticMethod(p)類名::staticMethod常用的方法引用類型及語法1、函數(shù)式接口的定義所謂函數(shù)式接口,是指在接口定義中,只有一個待重寫的抽象方法。在例7.1中定義的Cubage接口就屬于函數(shù)式接口,其內部只有一個抽象方法doCubage()。函數(shù)式接口中的抽象方法是指自身只能定義一個抽象方法,不包括從父類繼承下來的方法。7.6.2函數(shù)式接口2、@FunctionalInterface注解在接口定義前加上一個@FunctionalInterface注解,表明該接口是一個函數(shù)式接口。系統(tǒng)會自動檢查該接口定義是否符合函數(shù)式接口規(guī)范。函數(shù)式接口只是限制了抽象方法只能有一個,對于其他的方法定義,如默認方法、靜態(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啟動一個線程,運行run()方法中的代碼Comparator<T>intcompare(To1,To2)(o1,o2)->int比較兩個參數(shù)的順序,返回負整數(shù),零或正整數(shù)Predicate<T>booleantest(T)(T)
->boolean判斷是否滿足條件,常用于篩選元素Consumer<T>voidaccept(T)(T)
->void消費者接口,完成一個對象操作,無需返回值Supplier<T>Tget()()
->T生產者接口,獲取指定的結果Function<T,R>Rapply(T)(T)
->R函數(shù)形式,一個輸入,產生一個輸出結果【問題分析】根據(jù)題意,可以利用Java語言提供的比較器Comparator<T>,通過java.util包中的數(shù)組封裝類Arrays.sort()方法實現(xiàn)自動排序。本題目中是對員工對象進行排序,需要我們自己定義排序規(guī)則,比較器Comparator<T>就可以實現(xiàn)這個功能。并且該比較器也是一個函數(shù)式接口,所以也可以Lambda表達式的形式實現(xiàn)。Example7_08.java【例7.8】現(xiàn)有一個公司的員工列表,請按給定要求排序后輸出員工信息:按年齡從大到小排序,如果年齡相同則按員工號從小到大排序。
7.6.2函數(shù)式接口C目錄ONTENTS7.2
實現(xiàn)接口7.3接口與多態(tài)7.4接口的設計與使用7.5
接口的功能擴展7.6Lambda表達式7.1接口7.7枚舉7.8小結如果一個對象的所有值可以一一列舉出來,則稱為枚舉。在Java中,枚舉類型也是一個類,用枚舉類的變量表示枚舉值。Java定義了一個基礎枚舉類Enum,任何枚舉類都是這個類的子類。使用枚舉可以提高程序的清晰性和可讀性。7.7枚舉7.7.1簡單的枚舉類enum枚舉名{枚舉常量表列}定義枚舉類后,就可以定義枚舉變量了。枚舉變量的定義形式:枚舉名枚舉變量表列;定義的語法形式:【例7.9】顯示一個星期中每一天的工作效率。Example7_09.java枚
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年委托投資協(xié)議
- CJ/T 3048-1995平面格柵除污機
- 寶雞三和職業(yè)學院《物流管理綜合模擬》2023-2024學年第二學期期末試卷
- 2025至2031年中國蛋型玻璃托盤行業(yè)投資前景及策略咨詢研究報告
- 2025至2031年中國熱切背心袋行業(yè)投資前景及策略咨詢研究報告
- 白城職業(yè)技術學院《基本統(tǒng)計分析軟件應用》2023-2024學年第二學期期末試卷
- 印品整飾復習測試附答案
- DB13T 5022-2019 冶金企業(yè)氣體防護站安全管理規(guī)范
- 湖泊藻類種群調控與營養(yǎng)鹽重構-洞察闡釋
- 鞍山師范學院《經濟數(shù)據(jù)分析與應用》2023-2024學年第二學期期末試卷
- 安徽省合肥八中2025屆高三最后一卷歷史試題及答案
- 【9語二?!?025年安徽合肥市第四十五中學中考二模語文試卷
- 2025春季學期國開電大本科《現(xiàn)代漢語專題》一平臺在線形考(任務1至5)試題及答案
- 消除“艾梅乙”醫(yī)療歧視-從我做起
- 2024年全國統(tǒng)一考試高考新課標Ⅱ卷數(shù)學試題(真題+答案)
- (高清版)JTGT 3610-2019 公路路基施工技術規(guī)范
- 語文(天津卷)(答題卡)
- 【真題】2023年徐州市中考道德與法治試卷(含答案解析)
- 刑法涉及安全生產的16宗罪解讀
- 鞍鋼冷軋質量保證書(可修改版)
- 河南省建設工程竣工驗收報告(共10頁)
評論
0/150
提交評論