標籤:文章 的區別 編寫 引用 inf 區別 ext spl 存取權限
匿名內部類也就是沒有名字的內部類,正因為沒有名字,所以匿名內部類只能使用一次,
它通常用來簡化代碼編寫,但使用匿名內部類還有個前提條件:必須繼承一個父類或實現一個介面。
使用匿名內部類的注意事項:
匿名內部類也就是沒有名字的內部類
正因為沒有名字,所以匿名內部類只能使用一次,它通常用來簡化代碼編寫
但使用匿名內部類還有個前提條件:必須繼承一個父類或實現一個介面
以上方式就是介面配合匿名內部類來使用。
在java中匿名內部類我們可以使用使用lamda運算式來寫。
匿名內部類可以實現一個介面的對象,注意是介面的對象,直接實現介面的抽象方法(所有),然後使用,因為沒有經過“類”這一環節,所以叫匿名類,即認為這一對象屬於某個不具名的類,這樣的過程自然就不能用這個“不具名的類”再產生其他對象,故只能產生這一個對象。
函數式介面,首先是一個介面,然後介面裡只有一個抽象方法,其他隨意,抽象方法只能有一個。這時可以用lambda運算式來建立函數式介面,lambda運算式負責實現那個唯一的抽象方法。
下面是一個總結 很好的一篇文章:
https://www.cnblogs.com/xiao-chuan/p/6014752.html
內部類的分類和使用1、成員內部類: 即作為外部類的一個成員存在,與外部類的屬性、方法並列。注意:成員內部類中不能定義靜態變數,但可以訪問外部類的所有成員。值得注意的是成員內部類編譯成功後會產生的兩個不同的類(.class)成員內部類的優點:1)、內部類作為外部類的成員,可以訪問外部類的私人成員或屬性。(即使將外部類聲明為PRIVATE,但是對於處於其內部的內部類還是可見的。)2)、用內部類定義在外部類中不可訪問的屬性。這樣就在外部類中實現了比外部類的private還要小的存取權限。 複製代碼package one;public class Outer{ private static int outer_i = 1; private int k=20; public static void outer1(){ //... } //成員內部類 class Inner{ int j=100;//內部類中外部類的執行個體變數可以共存 int inner_i=1; void inner1(){ System.out.println(outer_i);//外部類的變數如果和內部類的變數沒有同名的,則可以直接用變數名訪問外部類的變數 System.out.println(j);//在內部類中訪問內部類自己的變數直接用變數名 System.out.println(this.j);//也可以在內部類中用"this.變數名"來訪問內部類變數 //訪問外部類中與內部類同名的執行個體變數可用"外部類名.this.變數名"。 System.out.println(k);//外部類的變數如果和內部類的變數沒有同名的,則可以直接用變數名訪問外部類的變數 outer1(); } } //外部類的非靜態方法訪問成員內部類 public void outer2(){ Inner inner = new Inner(); inner.inner1(); } //外部類的靜態方法訪問成員內部類,與在外部類外部存取成員內部類一樣 public static void outer3(){ Outer out = new Outer();//step1 建立外部類對象 Inner inner=out.new Inner();//step2 根據外部類對象建立內部類對象 inner.inner1();//step3 訪問內部類的方法 } public static void main(String[] args){ outer3(); }}複製代碼 2、局部內部類: 即在方法中定義的內部類,與局部變數類似,在局部內部類前不加修飾符public或private,其範圍為定義它的代碼塊。 public class Outer { public void say(){ System.out.println("關門說真話!"); }}複製代碼public class Test { public void ting(){ class MiMi extends Outer{//定義一個局部的內部類,繼承Outer方法 //…… } new MiMi().say();//調用局部內部類中繼承的say方法 System.out.println("別人都不知道"); } public static void main(String[] args) { new Test().ting(); }}複製代碼 3、靜態內部類: 靜態內部類定義在類中,任何方法外,用static定義。注意:靜態內部類中可以定義靜態或者非靜態成員複製代碼package three;public class StaticTest { private static String name="abc"; private String sex="男"; static class Person{ private String age = "18";//內部私人成員 public String heigth = "180";//內部類公有成員 public void display(){ //System.out.println(sex);//報錯,不能直接存取外部類的非靜態成員 System.out.println(name);//只能直接存取外部類的靜態成員 System.out.println(age);//訪問本內部類成員。 } } public void testone(){ Person person = new Person(); person.display(); //System.out.println(heigth);//報錯,是因為不可以直接存取內部類私人成員 //System.out.println(age);//報錯,是因為不可以直接存取內部類公有成員 System.out.println(person.age);//可以訪問內部類的私人成員 System.out.println(person.heigth);//可以訪問內部類的公有成員 } public void testtwo(){ StaticTest st = new StaticTest(); System.out.println(name); System.out.println(sex); //System.out.println(age);//不可以直接存取內部類的成員 //System.out.println(heigth);//不可以直接存取內部類的成員 } public static void main(String[] args) { //調用StaticTest StaticTest staticTest = new StaticTest(); staticTest.testone(); staticTest.testtwo(); } } 複製代碼 4、匿名內部類: 匿名內部類是在抽象類別和介面的基礎之上發展起來的。匿名內部類如果繼承自介面,必須實現指定介面的方法,且無參數 。匿名內部類如果繼承自類,參數必須按父類的建構函式的參數傳遞匿名內部類的特點:1),一個類用於繼承其他類或是實現介面,並不需要增加額外的方法,只是對繼承方法的事先或是覆蓋。2),只是為了獲得一個對象執行個體,不需要知道其實際類型。3),類名沒有意義,也就是不需要使用到。複製代碼package three;abstract class parent {public abstract void like();}public class Demo { public static void main(String[] args) { parent pt = new parent(){ public void like(){ System.out.println("吃飯睡覺打豆豆。。。"); } }; pt.like(); }}複製代碼 匿名類與內部的聯絡與區別: 按所在位置可以分為兩大類: 1、在類的方法中 特點: a、可以訪問宿主類的所有元素 ; b、儲存宿主類對象的引用,建立對象時必須有宿主類對象; c、 不能有待用資料; 繼續劃分: A、本地內部類; B、匿名內部類 兩者的區別在於本地內部類有構造方法,而匿名內部類只能執行個體初始化; 2、在類或介面範圍中; A、普通內部類 B、靜態內部類 內部類總結:1.內部類作為外部類的一個特殊的成員來看待,因此它有類成員的封閉等級:private ,protected,預設(friendly),public 它有類成員的修飾符: static,final,abstract2.非靜態內部類nested inner class,內部類隱含有一個外部類的指標this,因此,它可以訪問外部類的一切資源(當然包括private)外部類訪問內部類的成員,先要取得內部類的對象,並且取決於內部類成員的封裝等級。非靜態內部類不能包含任何static成員.3.靜態內部類:static inner class,不再包含外部類的this指標,並且在外部類裝載時初始化. 靜態內部類只能訪問外部類static成員. 外部類訪問靜態內部類的成員:static成員:類名.成員;非static成員:對象.成員4.對於方法中的內部類或塊中內部類只能訪問塊中或方法中的final變數。
補充理解:
1.什麼是類,類可以理解為一個對象。(那麼各位友友們思考,我們為什麼需要一個對象?因為我們需要這個對象去完成某中事情)2.什麼是內部類呢?內部類就是在類的內部建立一個類,為什麼我們要在類的內部建立一個類呢?不直接在類的外面直接建立另一個類呢?何必這麼麻煩(因為我定義的這個內部類僅僅在本類中是有用的,其他的類使用完全沒有意義,所以我就定義在一個類的內部僅僅供給這個類來使用。)3.什麼是匿名內部類呢?就更有意思了,就是所我定義的這個類在本類裡面我就都認為他是沒有意義的,因為我只需要提供給本類中的一個方法來使用,其他方法不需要使用嘛。(所以我們就不在類的內部定義了,直接在一個方法中的返回符(;)之前我們就給他new ()並寫出來,這樣這個類就僅僅提供給這個方法使用)什麼時候使用匿名內部類,什麼時候使用匿名內部類呢?就是定義的這個類如果提供給兩個或者兩個以上的方法使用時就是用內部類、如果僅僅提供給一個方法使用時可以使用匿名內部類
關於介面配合匿名內部類使用的問題講究