1. 程式人生 > >關於Java的一些小總結-內部類、外部類

關於Java的一些小總結-內部類、外部類

內部類:

    內部類一般來說共分為4種:常規內部類、靜態內部類、區域性內部類、匿名內部類

     一.常規內部類:常規內部類沒有用static修飾且定義在在外部類類體中。

          1.常規內部類中的方法可以直接使用外部類的例項變數和例項方法。

          2.在常規內部類中可以直接用內部類建立物件

    執行結果如下:

    

    二.靜態內部類:與類的其他成員相似,可以用static修飾內部類,這樣的類稱為靜態內部類。靜態內部類與靜態內部方法相似,只能訪問外部類的static成員,不能直接訪問外部類的例項變數,與例項方法,只有通過物件引用才能訪問。

      由於static內部類不具有任何對外部類例項的引用,因此static內部類中不能使用this關鍵字來訪問外部類中的例項成員,但是可以訪問外部類中的static成員。這與一般類的static方法想通

        例如:

        

執行結果如下:

        

 三.區域性內部類:在方法體或語句塊(包括方法、構造方法、區域性塊或靜態初始化塊)內部定義的類成為區域性內部類。
      區域性內部類不能加任何訪問修飾符,因為它只對區域性塊有效。
      1).區域性內部類只在方法體中有效,就想定義的區域性變數一樣,在定義的方法體外不能建立區域性內部類的物件
      2).在方法內部定義類時,應注意以下問題:
       ①.方法定義區域性內部類同方法定義區域性變數一樣,不能使用private、protected、public等訪問修飾說明符修飾,也不能使用static修飾,但可以使用final和   abstract修飾


       ②.方法中的內部類可以訪問外部類成員。對於方法的引數和區域性變數,必須有final修飾才可以訪問。

       ③.static方法中定義的內部類可以訪問外部類定義的static成員

    例如:

        

        結果如圖所示:

        

 四.匿名內部類:定義類的最終目的是建立一個類的例項,但是如果某個類的例項只是用一次,則可以將類的定義與類的建立,放到與一         起完成,或者說在定義類的同時就建立一個類
      以這種方法定義的沒有名字的類成為匿名內部類。
      宣告和構造匿名內部類的一般格式如下:
      new ClassOrInterfaceName(){

       /*類體*/ }

   1.匿名內部類可以繼承一個類或實現一個介面,這裡的ClassOrInterfaceName是匿名內部類所繼承的類名或實現的介面名。但匿名內部類不能同時實現一個介面和繼承一個類,也不能實現多個介面。如果實現了一個介面,該類是Object類的直接子類,匿名類繼承一個類或實現一個介面,不需要extends和implements關鍵字。
   2.由於匿名內部類沒有名稱,所以類體中不能定義構造方法,由於不知道類名也不能使用關鍵字來建立該類的例項。實際上匿名內部類的定義、構造、和第一次使用都發生在同樣一個地方。此外,上式是一個表示式,返回的是一個物件的引用,所以可以直接使用或將其複製給一個物件變數。例:

   TypeName obj=new Name(){

       /*此處為類體*/
      };
  同樣,也可以將構造的物件作為呼叫的引數。例:
   someMethod(new Name(){
   /*此處為類體*/  });

    例如:

        

        結果如圖所示:

        

外部類:

        外部類,顧名思義,就是外部的類。定義一個類A,在A的內部再定義一個類B,則A就是外部了類,B就是內部類

外部類與內部類的區別與聯絡:

       內部類可以訪問外部類所有的方法和屬性,如果內部類和外部類有相同的成員方法和成員屬性,內部類的成員方法呼叫要優先於外部類即內部類的優先順序比較高(只限於類內部,在主方法內,內部類物件不能訪問外部類的成員方法和成員屬性),外部類只能訪問內部類的靜態常量或者通過建立內部類來訪問內部類的成員屬性和方法。