內部類能直接訪問外部類所有成員(含 private),無需創建外部類實例即可操作外部狀態,實現「器官屬於身體」的強關聯建模。
| 類型 | 定義位置 | 訪問外部成員 | 實例化方式 | 典型場景 |
|---|---|---|---|---|
| 成員內部類 | 類內部、方法外 | 全部(含非靜態) | new Outer().new Inner() | 需頻繁訪問外部狀態的輔助類 |
| 靜態內部類 | 類內部、static 修飾 | 僅靜態成員 | new Outer.Inner() | 工具類、Builder 模式、不依賴外部實例 |
| 局部內部類 | 方法/代碼塊內 | 外部類成員 + final/effectively final 局部變數 | 方法內 new Inner() | 臨時邏輯封裝、線程任務 |
| 匿名內部類 | 表達式位置 | 同局部內部類 | new Interface(){...} 或 new Parent(){...} | 事件監聽、策略模式、一次性實現 |
class Outer {
private int age = 12;
class Inner {
void print() { System.out.println(age); }
}
}
Outer.Inner in = new Outer().new Inner(); // 需外部實例
in.print(); // 12
class Outer {
private int age = 12;
class Inner {
private int age = 13;
void print(int age) { // 參數 age = 14
System.out.println("局部參數:" + age); // 14
System.out.println("內部類字段:" + this.age); // 13
System.out.println("外部類字段:" + Outer.this.age); // 12
}
}
}
class Outer {
static int age = 12;
static class Inner {
void print() { System.out.println(age); }
}
}
Outer.Inner in = new Outer.Inner(); // 直接 new
in.print(); // 12
class Outer {
private class Inner { void print() {} }
void useInner() { new Inner().print(); } // 僅外部類可創建
}
// 外部無法 new Outer.Inner()
class Outer {
void doWork(final int param) {
class Inner { void run() { System.out.println(param); } }
new Inner().run();
}
}
Runnable r = new Runnable() {
@Override public void run() { System.out.println("Hello"); }
};
new Thread(r).start();
Outer.classOuter$Inner.class($ 代表內部類分隔符)Outer$1.class、Outer$2.class...