1. 程式人生 > 實用技巧 >Java基礎——內部類

Java基礎——內部類

內部類

我們學習類與物件後,知道了類的定義和使用
也知道抽象類以及包裝器類的用法
類中除了定義成員屬性和成員方法外
還能新增內部類

概述

內部類(內建類)(巢狀類):定義在另一個類中的類。

特點

  1. 內部類是編譯時的語法,編譯後生成兩個獨立的類。
  2. 內部類可以訪問外部類的任何成員。
  3. 外部類不能直接訪問內部類的成員。
  4. 內部類可以為靜態,privateprotected修飾,外部類只能用publicdefault預設的包訪問。
  5. 用內部類定義在外部類不可訪問的屬性,實現必外部類的private更小的訪問許可權。

類別

  • 成員內部類
  • 區域性內部類
  • 匿名內部類
  • 靜態內部類

成員內部類

作為外部類的成員存在,與外部類的屬性、方法並列。

class OutClass{
      //成員屬性
      private int i;
      //成員方法
      void print(){
            System.out.println("外部類");
      }

      //內部類
      class Inner{
      }
}

建立物件

  • 在外部類的內部。
    • Inner i = new Inner();
  • 在外部類的外部。
    1. 建立一個外部類物件
    2. 生成一個內部類物件

訪問

  • 在內部類中訪問內部類變數。
    • 內部類.this.屬性;
  • 訪問外部類成員
    • 外部類名.this.屬性
  • 在外部類的外部訪問內部類
    • 內部類物件.物件名

區域性內部類

在方法中定義的內部類為區域性內部類。
區域性內部類不能加修飾符privatepublicprotected

class OutClass{
      //外包方法
      public void print(){
            System.out.println("外部類方法");
      
            //區域性內部類
            class Inner{
                  //區域性內部類方法
                  public void method(){

                  }
            }
            //建立區域性內部類物件
            Inner in = new Inner();
            //呼叫區域性內部類方法
            in.method();
      }
}

特點

  1. 區域性內部類可以訪問外包方法之外的外部類的所以成員
  2. 區域性內部類可以該訪問外包方法的引數
  3. 區域性內部類只能訪問區域性中被final修飾的區域性變數
  4. 區域性內部類不能宣告為介面

使用

使用區域性內部類時,需要

  1. 生成外部類物件
  2. 通過外部類物件呼叫外包方法;在方法中才能呼叫區域性內部類

匿名內部類

匿名內部類是區域性內部類的使用擴充套件
只建立類的一個物件,不用對內部類命名。

interface anonymous{
      void print();
}

class{
      public void print(){
            System.out.println("外部類方法");
            //匿名內部類
            anonymous an = new anonymous(){
                  //區域性內部類方法
                  public void method(){

                  }
            };
            an.method();
      }
}

特點

  1. 匿名類沒有類名,必須繼承一個類或實現一個介面。不能有顯式的extendsimplements
  2. 匿名類不能有構造方法,沒有匿名。可通過 new 父類名();建立物件
  3. 匿名類的建立和定義同時進行
  4. 匿名類只能一次性的建立物件
  5. 匿名類可以在方法體中,可以在引數列表中
  6. 匿名內部類不能是抽象類。
  7. 匿名內部類必須實現它的抽象父類或者接口裡的所有抽象方法
  8. 匿名內部類一定是在new的後面,其隱含實現一個介面或一個類,沒有類名

靜態內部類

靜態內部類定義在類中,在方法之外。static修飾

class OutClass{
      public void print(){
            System.out.println("外部類方法");
      }


      //靜態內部類
      protected static class Inner{
            
      }
}

使用

靜態內部類的物件可以直接生成

public class Demo{
      public static void main(String args[]){
            OutClass.Inner inner = new OutClass.Inner();
      }
}

特點

  1. 靜態內部類直接訪問外部類的靜態成員,不能直接訪問外部類的非靜態程式
  2. 靜態內部類可定義靜態成員,其他內部類不行
  3. 內部類有靜態成員,其內部類也必須為靜態。

部落格相關java專案:檢視Github專案
對應github專案:Inner
匯入專案的方法: Java基礎——Java如何匯入本地專案