天天看點

Java内部類與匿名内部類的差別内部類:匿名内部類:

内部類:

内部類基本概念

如果A類需要直接通路B類中的成員,而B類又需要建立A類的對象。這時,為了友善設計和通路,直接将A類定義在B類中。就可以了。A類就稱為内部類。内部類可以直接通路外部類中的成員。而外部類想要通路内部類,必須要建立内部類的對象。

class Outer {
        int num = ;

        class Inner {
            void show() {
                System.out.println("inner show run " + num);
            }
        }

        public void method() {
            Inner in = new Inner();// 建立内部類的對象。
            in.show();// 調用内部類的方法。
        }
    }
           

當内部類定義在外部類中的成員位置上,可以使用一些成員修飾符修飾 private、static。

1:預設修飾符。

直接通路内部類格式:外部類名.内部類名 變量名 = 外部類對象.内部類對象;

Outer.Inner in = new Outer.new Inner();//這種形式很少用。

但是這種應用不多見,因為内部類之是以定義在内部就是為了封裝。想要擷取内部類對象通常都通過外部類的方法來擷取。這樣可以對内部類對象進行控制。

2:私有修飾符。

通常内部類被封裝,都會被私有化,因為封裝性不讓其他程式直接通路。

3:靜态修飾符。

如果内部類被靜态修飾,相當于外部類,會出現通路局限性,隻能通路外部類中的靜态成員。

注意;如果内部類中定義了靜态成員,那麼該内部類必須是靜态的。

内部類編譯後的檔案名為:“外部類名$内部類名.java”;

為什麼内部類可以直接通路外部類中的成員呢?

那是因為内部中都持有一個外部類的引用。這個是引用是 外部類名.this

内部類可以定義在外部類中的成員位置上,也可以定義在外部類中的局部位置上。

當内部類被定義在局部位置上,隻能通路局部中被final修飾的局部變量。

匿名内部類:

沒有名字的内部類。就是内部類的簡化形式。一般隻用一次就可以用這種形式。匿名内部類其實就是一個匿名子類對象。想要定義匿名内部類:需要前提,内部類必須繼承一個類或者實作接口。

匿名内部類的格式:

new 父類名&接口名(){ 定義子類成員或者覆寫父類方法 }.方法。

匿名内部類的使用場景:

當函數的參數是接口類型引用時,如果接口中的方法不超過3個。可以通過匿名内部類來完成參數的傳遞。

其實就是在建立匿名内部類時,該類中的封裝的方法不要過多,最好兩個或者兩個以内。

繼續閱讀