首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 內部類完整指南:四大類型、實例化技巧與面試必考點

     編輯:Java 相關知識

什麼是內部類?

內部類是定義在另一個類內部的類。這種設計讓類之間的關係更緊密,同時能夠訪問外部類的私有成員,是 Java 封裝機制的重要補充。

public class Outer {
    class Inner {
        // 此時 Inner 就是內部類
    }
}

為什麼要使用內部類?

  1. 增強封裝性:將內部類隱藏在外部類中,不允許其他類直接訪問
  2. 提高可讀性與維護性:邏輯相關的類放在一起,結構更清晰

內部類的四大分類

內部類可以視為外部類的成員,因此可以使用 public、protected、private、static 等修飾符。根據定義位置和修飾符不同,分為四類:

  1. 實例內部類:無 static 修飾
  2. 靜態內部類:使用 static 修飾
  3. 局部內部類:定義在方法內部
  4. 匿名內部類:無名稱、只使用一次的特殊形式

3.1 實例內部類

定義:未使用 static 修飾的內部類,屬於外部類的對象,而非外部類本身。

創建方式:必須先有外部類對象,再通過外部類對象創建內部類對象。

Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();

核心特點:

  • 內部類對象存在時,外部類對象必須存在
  • 內部類自動持有外部類引用,可無條件訪問外部類所有成員(含私有)
  • 發生同名遮蔽時,可用 Outer.this.field 訪問外部類成員
  • 外部類無法直接訪問內部類成員,需先創建內部類對象

3.2 靜態內部類

定義:使用 static 修飾,屬於外部類本身,不依賴外部類對象。

創建方式:可直接通過外部類類名訪問。

Outer.Inner inner = new Outer.Inner();

核心特點:

  • 創建實例時不需要外部類對象
  • 只能直接訪問外部類的靜態成員;訪問實例成員需通過外部類對象
  • 可定義靜態和實例成員
  • 外部類可通過完整類名直接訪問其靜態成員

3.3 局部內部類(較少使用)

定義:定義在方法內,作用域僅限該方法,類似局部變量。

限制:不能使用 public、protected、private、static 修飾。

關鍵規則:訪問的局部變量必須是 final(Java 8+ 隱式 final)。原因是方法結束後棧幀銷毀,但內部類對象可能仍在堆中存活,需確保變量值不變。

3.4 匿名內部類(使用最頻繁)

定義:無名稱的局部內部類,適用於「只使用一次」的場景。

語法規則:

  • 必須繼承一個父類或實現一個介面(最多一個)
  • 無構造器,但會調用父類構造器
  • 常用於事件監聽、執行緒創建等場景
new Runnable() {
    @Override
    public void run() {
        System.out.println("執行任務");
    }
};

經典面試題解析

public class Outer {
    public void someOuterMethod() { /* Line 3 */ }
    public class Inner { }
    public static void main(String[] argv) {
        Outer o = new Outer(); // Line 8
    }
}
/* 哪行能實例化 Inner?
A. new Inner();        // Line 3
B. new Inner();        // Line 8
C. new o.Inner();      // Line 8
D. new Outer.Inner();  // Line 8
*/

答案:A。Line 3 在實例方法中,隱含 this 引用,等價於 this.new Inner()。Line 8 在靜態方法中,必須用 o.new Inner()。

總結圖解

內部類總結圖

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved