| 類型 | 聲明位置 | 修飾符 | 外部實例依賴 | 訪問外部成員 | 可定義靜態成員 |
|---|---|---|---|---|---|
| 靜態嵌套類 | 類成員位置 | 任意 | 否 | 僅靜態成員 | 是 |
| 非靜態內部類 | 類成員位置 | 任意 | 是 | 所有成員 (含 private) | 否 |
| 局部類 (非靜態上下文) | 方法/構造器/塊內部 | 無 (默認 package) | 是 | 外部所有 + 方法 final 變量 | 否 |
| 局部類 (靜態上下文) | 靜態方法/塊內部 | 無 | 否 | 外部靜態成員 + 方法 final 變量 | 否 |
| 匿名類 (非靜態上下文) | 表達式位置 | 隱式 final | 是 | 外部所有 + 方法 final 變量 | 否 |
| 匿名類 (靜態上下文) | 靜態表達式位置 | 隱式 final | 否 | 外部靜態成員 + 方法 final 變量 | 否 |
Outer.Nested n = new Outer.Nested();Outer.Inner i = new Outer().new Inner();new InterfaceName() { /* 方法實現 */ }
new ClassName(args) { /* 方法實現/字段 */ }
final,不可繼承final (編譯器複製副本)Outer.this.field 顯式限定super 僅指向父類,不可用於訪問外部類 (super.super 非法)abstract 或 finalclass Outer {
String name = "Vel";
class Inner {
String name = "Sharmi";
class InnerInner {
class InnerInnerInner {
void doSomething() {
System.out.println(name); // "Sharmi" (最近遮蔽)
System.out.println(Outer.this.name); // "Vel"
System.out.println(Inner.this.name); // "Sharmi"
}
}
}
}
class InnerChild extends Inner {
void doSomething() {
// System.out.println(name); // 編譯錯誤:遮蔽衝突
System.out.println(Outer.this.name); // "Vel"
System.out.println(super.name); // "Sharmi"
System.out.println(this.name); // "Sharmi" (繼承自 Inner)
}
}
}
class Outer2 {
static String name = "Vel";
static class Inner2 {
static String name = "Sharmi";
class InnerInner2 {
void doSomething() {
System.out.println(name); // "Sharmi"
System.out.println(Outer2.name); // "Vel"
}
}
}
}
class InnerChild2 extends Outer2.Inner2 { // 頂層類繼承靜態內部類
void doSomething() {
System.out.println(name); // "Sharmi" (繼承)
System.out.println(Outer2.name); // "Vel"
System.out.println(super.name); // "Sharmi"
System.out.println(this.name); // "Sharmi"
}
}
掌握內部類的作用域、實例關聯與變量解析規則,是編寫高內聚、低耦合 Java 代碼的關鍵技能之一。