關於接口配合匿名內部類使用的問題講究


匿名內部類也就是沒有名字的內部類,正因為沒有名字,所以匿名內部類只能使用一次,

它通常用來簡化代碼編寫,但使用匿名內部類還有個前提條件:必須繼承一個父類或實現一個接口。

使用匿名內部類的注意事項:

匿名內部類也就是沒有名字的內部類

正因為沒有名字,所以匿名內部類只能使用一次,它通常用來簡化代碼編寫

但使用匿名內部類還有個前提條件:必須繼承一個父類或實現一個接口

 

以上方式就是接口配合匿名內部類來使用。

在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.什么是類,類可以理解為一個對象。(那么各位友友們思考,我們為什么需要一個對象?因為我們需要這個對象去完成某中事情)

2.什么是內部類呢?內部類就是在類的內部創建一個類,為什么我們要在類的內部創建一個類呢?不直接在類的外面直接創建另一個類呢?何必這么麻煩(因為我定義的這個內部類僅僅在本類中是有用的,其他的類使用完全沒有意義,所以我就定義在一個類的內部僅僅供給這個類來使用。)

3.什么是匿名內部類呢?就更有意思了,就是所我定義的這個類在本類里面我就都認為他是沒有意義的,因為我只需要提供給本類中的一個方法來使用,其他方法不需要使用嘛。(所以我們就不在類的內部定義了,直接在一個方法中的返回符(;)之前我們就給他new ()並寫出來,這樣這個類就僅僅提供給這個方法使用)


什么時候使用匿名內部類,什么時候使用匿名內部類呢?

就是定義的這個類如果提供給兩個或者兩個以上的方法使用時就是用內部類、如果僅僅提供給一個方法使用時可以使用匿名內部類

  總結:

內部類總結: 1.內部類作為外部類的一個特殊的成員來看待,因此它有類成員的封閉等級:private ,protected,默認(friendly),public 它有類成員的修飾符: static,final,abstract 2.非靜態內部類nested inner class,內部類隱含有一個外部類的指針this,因此,它可以訪問外部類的一切資源(當然包括private)外部類訪問內部類的成員,先要取得內部類的對象,並且取決於內部類成員的封裝等級。非靜態內部類不能包含任何static成員. 3.靜態內部類:static inner class,不再包含外部類的this指針,並且在外部類裝載時初始化. 靜態內部類只能訪問外部類static成員. 外部類訪問靜態內部類的成員:static成員:類名.成員;非static成員:對象.成員 4.對於方法中的內部類或塊中內部類只能訪問塊中或方法中的final變量。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM