天天看點

Java中的内部類(成員内部類、靜态内部類、局部内部類、匿名内部類)

分享知識 傳遞快樂

Java中的内部類

例:

public class 外部類的名稱{
    //外部類的成員
    public class 内部類的名稱{
             //内部類的成員
    }
}      

使用内部類有什麼好處:

  • 實作多重繼承;
  • 内部類可以很好的實作隐藏:一般的非内部類,是不允許有 private 與protected權限的,但内部類可以;
  • 減少了類檔案編譯後的産生的位元組碼檔案的大小。

**使用内部類的缺點:**使程式結構不清楚。

内部類在編譯完成後也會産生.class檔案,但檔案名稱是:外部類名稱$内部類名稱.class

内部類的種類:成員内部類、靜态内部類、局部内部類、匿名内部類。下面分别詳細學習一下這四種内部類的具體使用。

一、成員内部類

1、成員内部類也叫執行個體内部類。

應用場合:每一個外部類對象都需要一個内部類的執行個體,内部類離不開外部類存在(相當于心髒對人體)

2、成員内部類的特征:

  • 作為外部類的一個成員存在,與外部類的屬性、方法并列;
  • 成員内部類持有外部類的引用;
  • 成員内部類中不能定義static變量和方法。

代碼:

public class App {

  private String name = "成員内部類 - 1";

  public static void main(String[] args) throws Exception {
    //方法一:
    // App app = new App();
    // InnerApp innerApp = app.new InnerApp();
    // innerApp.show();

    //方法二:
    App.InnerApp innerApp = new App().new InnerApp();
    innerApp.show();
    System.out.println(innerApp.name);
  }

  public class InnerApp {
    private String name = "成員内部類 - 2";

    public void show() {
      System.out.println(App.this.name);
      System.out.println("内部類!");
    }
  }
}      

二、靜态内部類

1、内部類如果使用static聲明,則此内部類就稱為靜态内部類。(其實也相當于外部類)可以通過外部類 . 内部類來通路。

2、靜态内部類使用場合:

内部類不需要外部類的執行個體(注意區分成員内部類),靜态内部類存在僅僅為外部類提供服務或者邏輯上屬于外部類,且邏輯上可以單獨存在。

3、靜态内部類的特征:

  • 靜态内部類不會持有外部類的引用;
  • 靜态内部類可以通路外部的靜态變量,如果通路外部類的成員變量必須通過外部類的執行個體通路

4、Java中隻有内部類才可以是靜态的

代碼:

public class App {

  String name = "靜态内部 - 1";

  public static void main(String[] args) throws Exception {
    App.InnerApp innerApp = new App.InnerApp();
    innerApp.print();
  }

  static class InnerApp {
    String name = "靜态内部 - 2";

    public void print() {
      System.out.println(name);
    }

  }

}      

三、局部内部類

1、局部内部類也叫區域内嵌類,局部内部類與成員内部類類似,不過,區域内嵌類是定義在一個方法中的内嵌類。

2、使用場合:

如果内部類對象僅僅為外部類的某個方法使用,使用局部内部類

3、特征:

  • 用在方法内部,作用範圍僅限于該方法中;
  • 根據情況決定持有外部類對象引用;
  • 不能使用private,protected,public修飾符;
  • 不能包含靜态成員。

代碼:

public class App {

  String name = "局部内部類 - 1";

  public static void main(String[] args) {
    App app = new App();
    app.show();
  }

  public void show() {
    final String name = "局部内部類 - 2";

    class InnerApp {

      public void print() {
        System.out.println(name);
      }

    }

    new InnerApp().print();
  }

}      

四、匿名内部類

1、如果一個内部類在整個操作中隻使用一次的話,就可以定義為匿名内部類。

匿名内部類也就是沒有名字的内部類,這是java為了友善我們編寫程式而設計的一個機制,因為有時候有的内部類隻需要建立一個它的對象就可以了,以後再不會用到這個類,這時候使用匿名内部類就比較合适。

2、使用場合:

簡化内部類的使用

3、特征:

  • 使用new建立 ,沒有具體位置;
  • 建立的匿名類,預設繼承或實作new後面的類型;
  • 根據使用情況決定是否持有外部類對象引用;
  • 内嵌匿名類編譯後生成的.class檔案的命名方式是”外部類名稱$編号.class”,編号為1,2,3…n,編号為x的檔案對應的就是第x個匿名類

代碼:

public class App {

  String name = "匿名内部類 - 1";

  public static void main(String[] args) {
    Person p = new Person() {
      public void run() {
        System.out.println("匿名内部類實作的");
      }
    };
    p.run();
  }

}

public interface Person {

  public void run();
}      

————————————

繼續閱讀