Java 允許在類內部定義類(內部類)。若內部類**未聲明 static**,它隱含持有外部類實例的引用(Outer.this),因此**只能在外部類實例上下文中創建**。main 方法屬於靜態上下文,無 this 引用,直接 new Inner() 會編譯錯誤:non-static variable this cannot be referenced from a static context。
public class Outer {
class Inner { // 非靜態內部類
void run() { System.out.println("Inner"); }
}
public static void main(String[] args) {
Inner in = new Inner(); // 編譯錯誤
}
}
static class Inner { ... } // 不再持有 Outer.this
// main 中可直接 new Inner()
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
最符合單一職責原則,避免耦合。
| 類型 | 關鍵字 | 持有外部引用 | 訪問外部私有成員 | 典型用途 |
|---|---|---|---|---|
| 非靜態內部類 | 無 | 是 | 是 | 需強綁定外部實例狀態(如迭代器、事件監聽器) |
| 靜態嵌套類 | static | 否 | 否(僅靜態成員) | 邏輯歸屬外部類、無需外部狀態(如 Builder、DTO、Node) |
| 局部類 | 方法內定義 | 是(最終變數) | 是 | 臨時邏輯封裝、策略模式實現 |
| 匿名類 | new Interface() {} | 是 | 是 | 一次性回調、Runnable/Comparator 就地實現 |
static 嵌套類**,除非確確實實需要外部實例上下文。