




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第8章內嵌類與lambda表達式1教學目標(1) 理解內嵌類概念(2) 掌握成員內部類的定義和使用(3) 掌握局部內部類的定義和使用(4) 掌握匿名內部類的定義和使用(5) 掌握靜態內嵌類的定義和使用(6) 掌握lambda表達式的語法,理解并能定義函數式接口(7) 理解lambda表達式的作用域,掌握lambda表達式如何訪問外部變量(8) 掌握lambda表達式靜態方法引用、實例方法引用、構造方法引用(9) 掌握ArrayList的方法forEach()、removeIf()與lambda表達式的聯合使用(10)掌握Comparator接口的使用2內容38.1內嵌類8.1.1成員內部類8.1.2局部內部類8.1.3匿名內部類8.2.2
lambda表達式作用域8.2.3方法引用8.2.4lambda表達式與ArrayList8.1.4靜態內嵌類8.2lambda表達式8.2.1lambda表達式語法8.2.5Comparator接口內容48.1內嵌類8.1.1成員內部類8.1.2局部內部類8.1.3匿名內部類8.2.2
lambda表達式作用域8.2.3方法引用8.2.4lambda表達式與ArrayList8.1.4靜態內嵌類8.2lambda表達式8.2.1lambda表達式語法8.2.5Comparator接口8.1內嵌類內嵌類(nestedclass),是指定義在另一個類中的類。包含內嵌類的外部類被稱為內部類的外嵌類。使用內嵌類的主要原因:內嵌類可以對同一包中的其它類隱藏,增強了代碼的封裝性,使得代碼更加模塊化和可維護。內嵌類可以直接訪問外嵌類的成員變量和方法,復用外嵌類的代碼,無需通過復雜的接口實現或繼承關系來實現代碼復用。58.1內嵌類內嵌類包括靜態內嵌類:顯式使用static修飾的內嵌類隱式靜態類:成員枚舉類、局部枚舉類、成員記錄類、局部記錄類、一個接口的成員類內部類:非顯式、隱式靜態的內嵌類實名內部類匿名內部類678-1內嵌類可以分為
[填空1]
和
[填空2]
。作答填空題1分88-2關于內嵌類的描述錯誤的是()內嵌類可以對同一包的其他類隱藏內嵌類可以增強代碼的封裝性內嵌類不能實現代碼復用內嵌類可訪問外嵌類的數據域和方法ABCD提交單選題1分內容98.1內嵌類8.1.1成員內部類8.1.2局部內部類8.1.3匿名內部類8.2.2
lambda表達式作用域8.2.3方法引用8.2.4lambda表達式與ArrayList8.1.4靜態內嵌類8.2lambda表達式8.2.1lambda表達式語法8.2.5Comparator接口內容108.1內嵌類8.1.1成員內部類8.1.2局部內部類8.1.3匿名內部類8.2.2
lambda表達式作用域8.2.3方法引用8.2.4lambda表達式與ArrayList8.1.4靜態內嵌類8.2lambda表達式8.2.1lambda表達式語法8.2.5Comparator接口8.1.1成員內部類成員內部類是最普通的內部類,它的定義為位于另一個類的內部。Java語言定義成員內部類一般形式如下:修飾符1可以使用public或缺省(無修飾符)修飾符2可以是public、protected、private或缺省當內部類被private修飾時,該內部類在外嵌類的外部不可見當內部類被public修飾時,該內部類在外嵌類的外部可見成員內部類也可以繼承父類、實現接口11[修飾符1]classOuterClass{//外嵌類//...[修飾符2]classNestedClass[extends…][implements…]{//成員內部類//...}}8.1.1成員內部類外嵌類和實名內部類都會產生自己獨立的字節碼文件。對于實名內部類,其字節碼文件的文件名為:外嵌類名$實名內部類名.class。簡單示例:程序清單8-1CircleNestDemo.java程序清單8-1對應的Java源文件只有一個:CircleNestDemo.java,產生的字節碼文件有兩個:CircleNestDemo.class,CircleNestDemo$Draw.class。128.1.1成員內部類需要注意的是,當成員內部類擁有和外嵌類同名的成員變量或者方法時,會發生隱藏現象。這時,在成員內部類中,默認訪問的是成員內部類的成員。如果要在成員內部類中訪問外嵌類的同名成員,需要以下面的形式進行訪問:外嵌類名.this.成員變量外嵌類名.this.成員方法創建成員內部類實例的一般語法形式如下:外嵌類類名.內部類類名內部類對象名=外嵌類實例名.new內部類類名(參數列表);成員內部類允許定義靜態方法,在外嵌類的外部被引用時,需使用“外嵌類名.內部類名.靜態方法”進行調用。程序清單8-2展示了成員內部類實例的創建、成員內部類靜態方法的定義及其調用、同名成員的隱藏現象:InnerClassDemo1.java138.1.1成員內部類雖然成員內部類可以訪問外嵌類的所有成員,但是,反過來,外嵌類卻不能直接訪問成員內部類的成員。如果要在外嵌類中訪問成員內部類的成員,必須先創建一個成員內部類的對象,再通過這個對象的引用來訪問成員內部類的成員。示例:程序清單8-3CircleNestDemo2.java14158-3如果要在成員內部類中訪問外嵌類的同名成員方法,需要以下面的形式進行訪問:
[填空1]
作答填空題1分168-4成員內部類允許定義靜態方法,在外嵌類的外部被引用時,需使用“
[填空1]
”進行調用。作答填空題1分內容178.1內嵌類8.1.1成員內部類8.1.2局部內部類8.1.3匿名內部類8.2.2
lambda表達式作用域8.2.3方法引用8.2.4lambda表達式與ArrayList8.1.4靜態內嵌類8.2lambda表達式8.2.1lambda表達式語法8.2.5Comparator接口8.1.2局部內部類局部內部類是指定義在外嵌類的方法里面或者一個語句塊作用域里面的類訪問權限僅限于方法內或者該語句塊作用域內與方法的局部變量一樣,不能用public、protected、private以及static、sealed修飾符修飾。對外部世界是完全隱藏的,體現了更好的封裝性。不僅能訪問外嵌類成員,還能訪問所在方法或所在語句塊作用域內的局部變量。示例:程序清單8-4LocalInnerClassDemo.java18198-5局部內部類是指定義在外嵌類的
[填空1]
里面或者一個
[填空2]
作用域里面的類。作答填空題2分內容208.1內嵌類8.1.1成員內部類8.1.2局部內部類8.1.3匿名內部類8.2.2
lambda表達式作用域8.2.3方法引用8.2.4lambda表達式與ArrayList8.1.4靜態內嵌類8.2lambda表達式8.2.1lambda表達式語法8.2.5Comparator接口8.1.3匿名內部類在使用局部內部類的場景中,如果局部內部類的名稱只被使用一次,僅用于創建這個局部內部類的對象,那么可以對局部內部類進行簡化,可以無需指定局部內部類的類名。這樣的一個沒有名字的局部內部類被稱為匿名內部類。示例:程序清單8-5AnnonymousInnerClassDemo.java218.1.3匿名內部類通常,匿名內部類的語法形式如下:new父類型名稱(父類型構造方法參數列表){
匿名內部類的成員方法和成員數據域定義;}這里的父類型既可以是接口,也可以是一個類(通常是抽象類)。當父類型是接口時,父類型構造方法參數列表為空,調用的構造方法是Object(),語法形式可以簡化為:new接口名(){
數據域定義; 方法定義;}228.1.3匿名內部類匿名內部類還具有以下幾個特點:一個匿名內部類沒有類名,而構造方法的名稱必須與類名相同,因此,匿名內部類沒有構造方法定義。一個匿名內部類必須實現父類型的所有抽象方法,因為匿名內部類自身不能是抽象的。每個匿名內部類都有自己對應的字節碼文件,字節碼文件命名形式是:外嵌類類名$n.class,在美元符號$后的符號n表示從1開始編號的整數。如果一個外嵌類有多個匿名內部類,那么這些匿名內部類的文件名從數字1開始編號命名,即:外嵌類類名$1.class、外嵌類類名$2.class、外嵌類類名$3.class、…。23248-5每個匿名內部類都有自己對應的字節碼文件,字節碼文件命名形式是:
[填空1]
作答填空題1分258-6下面關于匿名內部類的說法正確的是()匿名內部類必須提供一個無參構造方法匿名內部類只能繼承一個類,不能實現接口匿名內部類可以實現接口,但必須提供構造方法匿名內部類必須實現父類型的所有抽象方法ABCD提交單選題1分內容268.1內嵌類8.1.1成員內部類8.1.2局部內部類8.1.3匿名內部類8.2.2
lambda表達式作用域8.2.3方法引用8.2.4lambda表達式與ArrayList8.1.4靜態內嵌類8.2lambda表達式8.2.1lambda表達式語法8.2.5Comparator接口8.1.4靜態內嵌類用關鍵字static顯式修飾的內嵌類是靜態內嵌類,靜態內嵌類沒有對外嵌類對象的引用。顯式聲明靜態內嵌類的一般形式如下所示:[修飾符1]classOuterClass{//外嵌類
//...[修飾符2]staticclassNestedClass{//靜態內嵌類
//...}}修飾符1可以使用public或缺省(無修飾符)修飾符2可以是public、protected、privated或缺省隱式聲明的靜態內嵌類包括:成員枚舉類、局部枚舉類、成員記錄類、局部記錄類、一個接口的成員類278.1.4靜態內嵌類靜態內嵌類與成員內部類不同,不再持有外嵌類的引用,即不能使用“外嵌類名.this”引用外嵌類的實例成員。靜態內嵌類對象的創建語法形式如下:外嵌類名.靜態內嵌類內部類對象名=new外嵌類名.靜態內嵌類();程序清單8-6StaticNestedClsDemo.Java28298-7隱式聲明的靜態內嵌類包括()成員枚舉類局部內部類局部記錄類匿名靜態內部類ABCD提交多選題1分內容308.1內嵌類8.1.1成員內部類8.1.2局部內部類8.1.3匿名內部類8.2.2
lambda表達式作用域8.2.3方法引用8.2.4lambda表達式與ArrayList8.1.4靜態內嵌類8.2lambda表達式8.2.1lambda表達式語法8.2.5Comparator接口8.2.1lambda表達式語法lambda表達式是JAVASE8提供的一種新特性,可以看做是一段可以傳遞的代碼。在Java語言中,lambda表達式還可以被稱為閉包或匿名函數。下面用lambda表達式改寫程序清單8-5的示例,說明lambda表達式如何替代匿名內部類,如程序清單8-7所示。程序演示:LambdaDemo1.java函數式接口是一個不能使用關鍵字seal修飾、必須有且只有一個抽象方法(除了Object的public方法)的接口。函數式接口可以使用注解@FunctionalInterface進行修飾,其作用僅僅在于強迫Java編譯器對接口進行語法檢查,是否只定義了一個抽象方法,如果否,Java編譯器就會報錯。不使用注解@FunctionalInterface,也能正確運行。函數式接口也可以被成為單抽象方法(SingleAbstractMethod,SAM)接口。31328-8函數式接口可以使用注解
[填空1]
進行修飾。作答填空題1分8.2.1lambda表達式語法lambda表達式可以簡化函數式接口的實現338.2.1lambda表達式語法lambda表達式由三個部分組成:參數列表、箭頭、方法體,一般語法形式如下:(數據類型參數名稱)->{語句組}類型推斷:程序清單8-7第8行必須先指定apple對象的類型是EatMethod,這樣Java編譯器就可以推斷出賦值語句右邊的表達式返回的是一個實現了函數式接口EatMethod的匿名類對象。lambda表達式的參數列表既可以和函數式接口中抽象方法的參數列表完全一致,也可以省略參數列表中的數據類型,此時參數的數據類型由編譯器隱式推斷。當參數列表只有一個參數時,圓括號可以省略。當參數列表為空時,必須要使用一對圓括號。34358-9lambda表達式由三個部分組成:
[填空1]
、
[填空2]
、方法體作答填空題2分8.2.1lambda表達式語法lambda表達式的方法體如果只有一條語句,那么方法體部分的花括號可以省略。并且,如果這一條語句是return語句,可以省略關鍵字return。因此,程序清單8-7第8行可以進一步簡化為:EatMethodapple=()->eatInfo+":榨蘋果汁";程序清單8-7第8行-9行,可以簡化為如下一條語句:System.out.println(info(()->eatInfo+":榨蘋果汁"));此時,lambda表達式直接替換了方法的參數,而且分號;是不需要的。由于方法info的形參類型確定為接口類型EatMethod,所以Java編譯器會推斷出這個lambda表達式是返回一個實現了函數式接口EatMethod的匿名類對象。368.2.1lambda表達式語法lambda表達式能用于簡化函數式接口的實現,對于函數式接口的定義需要準確理解。函數式接口不僅要有一個抽象方法,而且該抽象方法不能是類Object的public方法37例,下面接口定義不是一個函數式接口:interfaceNonFunc{booleanequals(Objectobj);}因為方法equals()是類Object的public方法。接口NonFunc的子接口可以是函數式接口,只要這個子接口聲明了一個不是類Object成員的抽象方法,例如:interfaceFuncextendsNonFunc{intcompare(Stringo1,Stringo2);}8.2.1lambda表達式語法lambda表達式能用于簡化函數式接口的實現,對于函數式接口的定義需要準確理解。函數式接口不僅要有一個抽象方法,而且該抽象方法不能是類Object的public方法38Java語言提供的有用接口java.util.Comparator<T>是一個函數式接口,定義如下:interfaceComparator<T>{booleanequals(Objectobj);//類Object的public方法intcompare(To1,To2);//不是類Object的public方法}接口Func是否函數式接口呢?interfaceFunc{intm();Objectclone();}接口Func不是函數式接口8.2.1lambda表達式語法展示lambda表達式帶有1個、2個參數的情況:程序清單8-8LambdaDemo2.javalambda表達式的省略規則如下:(1)lambda表達式參數列表中參數的數據類型可以省略,而且必須同時省略,不允許省略其中一部分參數的數據類型,而另一部分參數不省略。(2)在lambda表達式省略參數的數據類型之后,如果參數列表只有一個參數時,圓括號可以省略。其他情況下,圓括號不能省略。具體地,當參數列表為空時,不能省略圓括號;當參數列表中的參數個數不少于2個時,也不能省略圓括號。(3)當lambda表達式方法體中的語句只有一條時,可以省略花括號和分號。進一步,當這一條語句是return語句時,return也必須省略。39408-10當lambda表達式方法體中的語句只有一條時,可以省略
[填空1]
和
[填空2]
作答填空題2分8.2.1lambda表達式語法Java編譯器在解析一個lambda表達式時,等同于是從一個匿名內部類創建一個匿名對象。通常,Java編譯器處理lambda表達式有三個步驟:①確定lambda表達式的數據類型;②確定參數的數據類型;③確定方法體語句。41428-11下列選項中符合lambda表達式語法的是()x->returnx+1x,y->x+yx->{x=x*2;x+1;} x->{x=x*2;returnx+1;}ABCD提交單選題1分內容438.1內嵌類8.1.1成員內部類8.1.2局部內部類8.1.3匿名內部類8.2.2
lambda表達式作用域8.2.3方法引用8.2.4lambda表達式與ArrayList8.1.4靜態內嵌類8.2lambda表達式8.2.1lambda表達式語法8.2.5Comparator接口8.2.2lambda表達式作用域lambda表達式的體與其形成的嵌套塊具有相同的作用域。因此,在lambda表達式中聲明一個與其外部作用域同名的局部變量是不合法的。lambda表達式訪問外圍方法或類中的變量,有一個重要的限制:只能引用外部變量的值而不能改變外部變量的值。并且,如果在lambda表達式中引用了一個外部變量,這個外部變量也不能在外部改變。lambda表達式訪問外圍作用域的變量必須是最終變量(即常量)或事實最終(effectivefinal)變量。事實最終變量是指一個變量被初始化后就不再為其賦新值。44458-12lambda表達式訪問外圍作用域的變量必須是常量或
[填空1]
變量。(只填中文)作答填空題1分內容468.1內嵌類8.1.1成員內部類8.1.2局部內部類8.1.3匿名內部類8.2.2
lambda表達式作用域8.2.3方法引用8.2.4lambda表達式與ArrayList8.1.4靜態內嵌類8.2lambda表達式8.2.1lambda表達式語法8.2.5Comparator接口8.2.3方法引用方法引用也稱為函數引用,是指在lambda表達式中引用一個已經存在的方法,使其替代lambda表達式完成接口的實現。根據方法類型,可以分為:靜態方法引用、實例方法引用、構造方法引用。靜態方法引用靜態方法引用的一般語法形式:類名::靜態方法名程序清單8-10給出了一個靜態方法引用的示例:ReferStaticMethod.java(1)靜態方法引用,只需要靜態方法名,不需要在方法名后加圓括號。(2)被引用的靜態方法的參數列表和返回值,與lambda表達式實現的接口中抽象方法的參數列表和返回值一致。被引用的靜態方法的方法體,與lambda表達式的方法體一致。478.2.3方法引用實例方法引用實例方法引用的一般語法形式:對象名::實例方法名示例:程序清單8-11ReferInstanceMethod.java(1)實例方法引用與靜態方法不同,需要使用對象名,對象名可以是匿名的。(2)實例方法引用,只需要實例方法名,不需要在方法名后加圓括號。(3)被引用的實例方法的參數列表和返回值,與lambda表達式實現的接口中抽象方法的參數列表和返回值一致。被引用的實例方法的方法體,與lambda表達式的方法體一致488.2.3方法引用構造方法引用構造方法引用的一般語法形式:類名::new示例:程序清單8-12ReferConstructor.java49508-13根據方法引用的方法類型,可以分為
[填空1]
引用、
[填空2]
引用、
[填空3]
引用。作答填空題1.5分內容518.1內嵌類8.1.1成員內部類8.1.2局部內部類8.1.3匿名內部類8.2.2
lambda表達式作用域8.2.3方法引用8.2.4lambda表達式與ArrayList8.1.4靜態內嵌類8.2lambda表達式8.2.1lambda表達式語法8.2.5Comparator接口8.2.4lambda表達式與ArrayListArrayList中有兩個方法可以使用lambda表達式,這兩個方法是:forEach()、removeIf。(1)publicvoidforEach(Consumer<?superE>action)該方法可對當前列表的每個元素執行給定的操作,直到處理完所有元素或該操作引發異常為止。如果指定了迭代順序,則操作將按迭代順序執行。操作引發的異常會中繼到調用方。(2)publicbooleanremoveIf(Predicate<?superE>filter)該方法刪除當前列表中滿足給定謂詞(即某種條件)的所有元素。迭代期間或謂詞引發的錯誤或運行時異常會中繼到調用方。示例:程序清單8-13ListWithLambda.java528.2.4lambda表達式與ArrayList補充:Consumer接口是一個函數式接口,它定義了一個接受單個參數并且不返回結果的操作。Consumer接口包含一個抽象方法voidaccept(Tt),該方法接受一個參數,表示要執行的操作。Consumer接口通常用于表示一些需要對輸入進行處理但不產生返回值的操作。它可以被用于各種場景,例如集合操作、事件處理等。Predicate接口是一個函數式接口,用于表示一個斷言(predicate),即接受一個參數并返回一個布爾值的操作。它定義了一個名為test的抽象方法,該方法接受一個參數并返回一個布爾值,用于表示對給定輸入的條件判斷。Predicate接口通常用于在函數式編程中進行條件過濾或測試。它提供了一種方便的方式來定義和組合條件,以便對集合元素、對象或任何其他類型的數據進行過濾或測試。53548-14成績列表對象scoreList存儲了一個班的Java課程成績,請使用removeIf方法篩選出不及格的成績:
[填空
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 計算機二級VB學習資源與建議題及答案
- 2025年法學概論考試研究方法探討與試題及答案
- 2025租賃合同印花稅稅率是多少
- 2025年網絡管理員職業現狀分析試題及答案
- 企業持續經營能力的評估計劃
- 體育賽事安保工作總結與經驗分享計劃
- 2025上海市糧食批發市場糧油交易合同
- 軟件設計師考試目標規劃方法試題及答案
- 風雨同行共創生活部美好未來計劃
- 行政管理法中的重要理論概念試題及答案
- 湖北省武漢市2025屆高中畢業生四月調研考試生物試題及答案(武漢四調)
- 人教版二年級數學下冊第七單元創新情境卷(含答案)
- 無錫保安考試題型及答案
- 延遲退休合同協議
- 消毒隔離知識培訓課件
- 課后托管服務的崗位職責與管理
- 技術合作協議范本
- DB32-T 5082-2025 建筑工程消防施工質量驗收標準
- 2025年度建筑施工安全演練計劃
- 生產車間6S培訓
- 托幼機構十項衛生保健制度
評論
0/150
提交評論