Java 內(nèi)部類

2018-01-18 17:55 更新

Java面向?qū)ο蟮脑O(shè)計(jì) - Java 內(nèi)部類


什么是內(nèi)部類?

作為包的成員的類被稱為頂級類。

一個(gè)類可以在另一個(gè)類中聲明。這種類型的類稱為內(nèi)部類。

如果在另一個(gè)類中聲明的類被顯式或隱式聲明為static,它被稱為嵌套類,而不是內(nèi)部類。

包含內(nèi)部類的類稱為封閉類或外部類。

例子

下面的代碼聲明一個(gè)內(nèi)部類。

class Outer {
  public class Inner {
    // Members of the Inner class go here
  }
  // Other members of the Outer class go here
}

Outer類是一個(gè)頂級類。

Inner類是一個(gè)內(nèi)部類。它是外類的成員。

外層類是Inner類的封閉(外部)類。

內(nèi)部類可以是另一個(gè)內(nèi)部類的封閉類。內(nèi)部類的嵌套層次沒有限制。

內(nèi)部類的實(shí)例只能存在于其封閉類的實(shí)例中。

使用內(nèi)部類的優(yōu)點(diǎn)

以下是內(nèi)部類的一些優(yōu)點(diǎn)。

  • 在將使用它們的其他類附近定義類。
  • 提供了一個(gè)額外的命名空間來管理類結(jié)構(gòu)。
  • 一些設(shè)計(jì)模式使用內(nèi)部類更容易實(shí)現(xiàn)。
  • 實(shí)現(xiàn)回調(diào)機(jī)制使用內(nèi)部類是優(yōu)雅和方便的。它有助于在Java中實(shí)現(xiàn)閉包。

訪問局部變量的限制

下面的代碼演示了訪問局部內(nèi)部類中的局部變量的規(guī)則。

main()方法聲明兩個(gè)局部變量x和y。這兩個(gè)變量都是最終的。

變量x在被初始化之后從不改變,變量y不能被改變,因?yàn)樗宦暶鳛閒inal。

public class Main {
  public static void main(String... args) {
    int x = 1;
    final int y = 2;

    class LocalInner {
      void print() {
        System.out.println("x = " + x);
        System.out.println("y = " + y);
      }
    }
    /*
     * Uncomment the following statement will make the variable x no longer
     * an effectively final variable and the LocalIneer class will not compile.
     */
    // x = 100;

    LocalInner li = new LocalInner();
    li.print();
  }
}

上面的代碼生成以下結(jié)果。

內(nèi)部類和繼承

內(nèi)部類可以繼承另一個(gè)內(nèi)部類,頂級類或其封閉類。

class A {
  public class B {
  }

  public class C extends B {
  }

  public class D extends A {
  }
}

class E extends A {
  public class F extends B {
  }
}

內(nèi)部類中沒有靜態(tài)成員

Java中的關(guān)鍵字static使一個(gè)構(gòu)造成為一個(gè)頂層結(jié)構(gòu)。

因此,我們不能為內(nèi)部類聲明任何靜態(tài)成員(字段,方法或初始化器)。

允許在內(nèi)部類中有作為編譯時(shí)常量的靜態(tài)字段。

class A {
  public class B {
    public final static int DAYS_IN_A_WEEK = 7; // OK
    public final String str = new String("Hello");
  }
}

生成的內(nèi)部類的類文件

每個(gè)內(nèi)部類都被編譯成一個(gè)單獨(dú)的類文件。

成員內(nèi)部類和靜態(tài)內(nèi)部類的類文件名格式如下:

<outer-class-name>$<member-or-static-inner-class-name>

局部內(nèi)部類的類文件名的格式如下:

<outer-class-name>$<a-number><local-inner-class-name>

匿名類的類文件名的格式如下:

<outer-class-name>$<a-number>

類文件名中的<a-number>是從1開始順序生成的數(shù)字,以避免任何名稱沖突。

靜態(tài)上下文中的內(nèi)類

我們可以在靜態(tài)上下文中定義一個(gè)內(nèi)部類,例如靜態(tài)方法或靜態(tài)初始化器。

所有靜態(tài)字段成員都可以訪問這樣的內(nèi)部類。

class Outer {
  static int k = 1;
  int m = 2;

  public static void staticMethod() {
    // Class Inner is defined in a static context
    class Inner {
      int j = k; // OK. Referencing static field k
      // int n = m; // An error. Referencing non-static field m
    }
  }
}
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號