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

淺析 Java 嵌套類與內部類:靜態嵌套類、成員內部類、局部內部類、匿名內部類完整指南

     編輯:Java 相關知識

核心定義

  • 嵌套類:定義在另一個類別內部的類別,包含 static 與非 static 兩種。
  • 內部類:非 static 的嵌套類,專有名稱。內部類實例隱含持有外部類實例的引用。
  • 關係:內部類 ⊂ 嵌套類。
class Outer {
    static class StaticNested { }  // 靜態嵌套類
    class Inner { }                // 內部類(成員內部類)
}

訪問權限差異

類型可訪問外部類非 static 成員可定義 static 成員
靜態嵌套類否(需外部實例)是
內部類是(含 private)否(常數除外)

實例化語法

// 靜態嵌套類
Outer.StaticNested nested = new Outer.StaticNested();

// 內部類:需先有外部實例
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();

內部類的四種形式

1. 靜態嵌套類

本質是頂層類別,僅借外部類命名空間,不持有外部引用。

2. 成員內部類

非 static,與實例欄位/方法同層級,可自由訪問外部所有成員。

3. 局部內部類

定義在方法/程式碼區塊內,作用域僅限該區塊。不可加修飾符(private/public/protected/static),只能訪問方法內的 final 或 effectively final 變數。

public void doSomething() {
    final int c = 3;
    class Local { void test() { System.out.println(c); } }
    new Local().test();
}

4. 匿名內部類

無名稱的局部類,常用於介面回調或抽象類實例化:

button.addActionListener(new ActionListener() {
    @Override public void actionPerformed(ActionEvent e) { ... }
});
new Thread(new Runnable() { public void run() { ... } }).start();

序列化警示

強烈不建議序列化任何內部類(含局部、匿名)。編譯器會生成合成構造函數,不同 JDK 實作細節不同,導致跨 JRE 版本反序列化不相容。

使用建議

  • 需獨立存在、不依賴外部實例 → static 嵌套類。
  • 需頻繁訪問外部狀態、邏輯緊密相關 → 成員內部類。
  • 一次性邏輯、實作介面/抽象類 → 匿名內部類(Java 8+ 建議改用 Lambda)。
  • 方法內需封裝輔助邏輯 → 局部內部類。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved