Java基礎(chǔ) 內(nèi)部類(lèi)

“簡(jiǎn)單不先于復(fù)雜,而是在復(fù)雜之后.” —— Alan Perlis

s.jpg

內(nèi)部類(lèi)

  • 在Java中,可以將一個(gè)類(lèi)定義在另一個(gè)類(lèi)里面或者一個(gè)方法里面,這樣的類(lèi)稱(chēng)為內(nèi)部類(lèi)。內(nèi)部類(lèi)是一種非常有用的特性,因?yàn)樗试S你把一些邏輯相關(guān)的類(lèi)組織在一起,并控制位于內(nèi)部的類(lèi)的可視性。

廣泛意義上的內(nèi)部類(lèi)一般分為以下幾種類(lèi)型:

  • 成員內(nèi)部類(lèi)
    最普通的內(nèi)部類(lèi),它定義在另一個(gè)類(lèi)的內(nèi)部,如下所示
//外部類(lèi)
class Out {
  private int age = 12;

  //內(nèi)部類(lèi)
  class In {
      public void print() {
          System.out.println(age);
      }
  }
}

public class NormalInnerClass {
    public static void main(String[] args) {
        Out.In in = new Out().new In();
        in.print();
        //或者采用下種方式訪問(wèn)
        /*
        Out out = new Out();
        Out.In in = out.new In();
        in.print();
        */
    }
}

  • 局部?jī)?nèi)部類(lèi)
    局部?jī)?nèi)部類(lèi)是定義在一個(gè)方法或者一個(gè)作用域里面的類(lèi),它和成員內(nèi)部類(lèi)的區(qū)別在于局部?jī)?nèi)部類(lèi)的訪問(wèn)僅限于方法內(nèi)或者該作用域內(nèi)。
interface extendInnerClass{
    public int setAge();
}

//外部類(lèi)
class Out {
  private int age = 12;

  public extendInnerClass getInnerClass(){
      // 局部?jī)?nèi)部類(lèi)
      class innerClass implements extendInnerClass{
          public int setAge(){
              age++;
              return age;
          }

      }
      return new innerClass();
  }
}

public class NormalInnerClass {
    public static void main(String[] args) {
        Out out = new Out();
        System.out.println(out.getInnerClass().setAge());
    }
}
注意,局部?jī)?nèi)部類(lèi)就像是方法里面的一個(gè)局部變量一樣,是不能有public、protected、private以及static修飾符的。

靜態(tài)內(nèi)部類(lèi)

class Out3 {
    private static int age = 12;

    static class In {
        public void print() {
            System.out.println(age);
        }
    }
}

public class staticInnerClass {
    public static void main(String[] args) {
        Out3.In in = new Out3.In();
        in.print();
    }
}

可以看到,如果用static 將內(nèi)部?jī)?nèi)靜態(tài)化,那么內(nèi)部類(lèi)就只能訪問(wèn)外部類(lèi)的靜態(tài)成員變量,具有局限性

其次,因?yàn)閮?nèi)部類(lèi)被靜態(tài)化,因此Out.In可以當(dāng)做一個(gè)整體看,可以直接new 出內(nèi)部類(lèi)的對(duì)象(通過(guò)類(lèi)名訪問(wèn)static,生不生成外部類(lèi)對(duì)象都沒(méi)關(guān)系)

  • 匿名內(nèi)部類(lèi)
匿名內(nèi)部類(lèi)是唯一一種沒(méi)有構(gòu)造器的類(lèi)。正因?yàn)槠錄](méi)有構(gòu)造器,所以匿名內(nèi)部類(lèi)的使用范圍非常有限,大部分匿名內(nèi)部類(lèi)用于接口回調(diào)。匿名內(nèi)部類(lèi)在編譯的時(shí)候由系統(tǒng)自動(dòng)起名為Outter$1.class。一般來(lái)說(shuō),匿名內(nèi)部類(lèi)用于繼承其他類(lèi)或是實(shí)現(xiàn)接口,并不需要增加額外的方法,只是對(duì)繼承方法的實(shí)現(xiàn)或是重寫(xiě)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 內(nèi)部類(lèi)將一些邏輯相關(guān)的類(lèi)組織在一起,并控制位于內(nèi)部類(lèi)的可視性 為什么需要內(nèi)部類(lèi) 每個(gè)內(nèi)部類(lèi)都能獨(dú)立地繼承一個(gè)(接口...
    陳晨_Fly閱讀 268評(píng)論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,779評(píng)論 18 399
  • 記筆記是個(gè)好習(xí)慣,而我一直沒(méi)有,以后一定要慢慢養(yǎng)成這個(gè)習(xí)慣。內(nèi)部類(lèi)其實(shí)就是定義在一個(gè)普通外部類(lèi)內(nèi)部的類(lèi),基本的結(jié)構(gòu)...
    沒(méi)想到我也能寫(xiě)代碼閱讀 158評(píng)論 0 1
  • 1.內(nèi)部類(lèi)的概述: 把類(lèi)定義在另一個(gè)類(lèi)的內(nèi)部,該類(lèi)就被稱(chēng)為內(nèi)部類(lèi). 舉例:把類(lèi)B定義在類(lèi)A中,類(lèi)B就被稱(chēng)為內(nèi)...
    王子也寂寞閱讀 325評(píng)論 0 0
  • 1 她聽(tīng)見(jiàn)沉重的嘆息,像漲潮的聲音。月光穿過(guò)光禿禿的窗欞,投射進(jìn)來(lái),被切割的月光于是有了一種極不真切、殘缺的美。 ...
    每個(gè)好孩子都有糖吃閱讀 365評(píng)論 2 1