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();
本質是頂層類別,僅借外部類命名空間,不持有外部引用。
非 static,與實例欄位/方法同層級,可自由訪問外部所有成員。
定義在方法/程式碼區塊內,作用域僅限該區塊。不可加修飾符(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();
}
無名稱的局部類,常用於介面回調或抽象類實例化:
button.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) { ... }
});
new Thread(new Runnable() { public void run() { ... } }).start();
強烈不建議序列化任何內部類(含局部、匿名)。編譯器會生成合成構造函數,不同 JDK 實作細節不同,導致跨 JRE 版本反序列化不相容。
static 嵌套類。