Java 允許在類別內部定義另一個類別,稱為巢狀類。依修飾詞與定義位置分為四類:靜態嵌套類、內部類、區域類、匿名類。
static 修飾,與外部類實例無關OuterClass.StaticNestedClass obj = new OuterClass.StaticNestedClass();static 成員(常數除外)OuterClass outer = new OuterClass(); OuterClass.InnerClass inner = outer.new InnerClass();{...} 內new InterfaceOrClass() { ... }public class ShadowTest {
public int x = 0;
class FirstLevel {
public int x = 1;
void methodInFirstLevel(int x) {
System.out.println("x = " + x); // 參數 23
System.out.println("this.x = " + this.x); // 內部類欄位 1
System.out.println("ShadowTest.this.x = " + ShadowTest.this.x); // 外部類欄位 0
}
}
public static void main(String[] args) {
new ShadowTest().new FirstLevel().methodInFirstLevel(23);
}
}
x = 23 this.x = 1 ShadowTest.this.x = 0
強烈不建議序列化內部類,因其隱含外部類引用,序列化會連帶序列化外部類實例,導致資料膨脹與潛在安全風險。
// 執行緒簡寫
new Thread(() -> System.out.println("Running")).start();
// Swing 事件監聽
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Clicked");
}
});
| 類型 | 修飾詞 | 存取外部實例成員 | 可定義 static | 典型用途 |
|---|---|---|---|---|
| 靜態嵌套類 | static | 否 | 是 | 工具類、邏輯分組 |
| 內部類 | 無 | 是 | 否 | 迭代器、狀態綁定 |
| 區域類 | 無 | 是 | 否 | 方法內複雜邏輯封裝 |
| 匿名類 | 無 | 是 | 否 | 介面單次實作、事件監聽 |