將一個類定義在另一個類內部,即為內部類。編譯後生成獨立的 Outer$Inner.class 文件,但擁有特殊的訪問權限:可直接訪問外部類所有成員(含 private)。
定義在類內部、方法外部。可帶修飾符(public/protected/private/static)。
public class Outer {
private String msg = "Hello";
// 非靜態內部類
class Inner {
void print() {
System.out.println(msg); // 直接訪問外部 private 字段
}
}
// 靜態內部類
static class StaticInner {
void print() {
// System.out.println(msg); // 編譯錯誤:無法訪問非靜態成員
System.out.println("Static inner");
}
}
public void test() {
new Inner().print(); // 內部創建實例
}
}
// 外部創建非靜態內部類實例:需先有外部類實例
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
// 靜態內部類可直接創建
Outer.StaticInner staticInner = new Outer.StaticInner();
定義在方法/代碼塊內,僅在該作用域可見。只能訪問 final 或 實際上 final 的局部變量(Java 8+ 自動判斷)。
public class Outer {
public void method() {
final String localVar = "Local"; // Java 7 需显式 final
String effectiveFinal = "Effective"; // Java 8+ 隱式 final
class LocalInner {
void print() {
System.out.println(localVar);
System.out.println(effectiveFinal);
}
}
new LocalInner().print(); // 必須在方法內實例化
}
}
無類名,繼承類或實現接口並同時創建實例。大量用於事件監聽、線程創建、Comparator 定制。
// 實現接口
Runnable r = new Runnable() {
@Override public void run() { System.out.println("Running..."); }
};
// 繼承抽象類
abstract class Animal { abstract void sound(); }
Animal dog = new Animal() { void sound() { System.out.println("Woof"); } };
// 實際場景:按鈕點擊監聽
button.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) { doSomething(); }
});
被 static 修飾的成員內部類。不持有外部類引用,無法訪問非靜態成員,本質是頂級類,僅借外部類命名空間。
public class Outer {
static class Nested {
void print() { System.out.println("Nested"); }
}
}
// 直接訪問
Outer.Nested nested = new Outer.Nested();
| 類型 | 訪問外部非靜態成員 | 創建實例語法 | 典型應用場景 |
|---|---|---|---|
| 非靜態成員內部類 | ✅ 直接訪問 | outer.new Inner() | 迭代器實現、節點類 |
| 靜態嵌套類 | ❌ 僅靜態成員 | new Outer.Nested() | Builder 模式、緩存 Entry |
| 局部內部類 | ✅(final 變量) | 方法內 new Local() | 複雜邏輯封裝、臨時策略 |
| 匿名內部類 | ✅(final 變量) | new Interface() {} | 回調、事件、線程、比較器 |
Java 單繼承限制下,內部類可獨立繼承不同類/實現不同接口:
class A {}
interface B {}
interface C {}
class Outer {
class InnerA extends A {} // 繼承 A
class InnerB implements B {} // 實現 B
class InnerC implements C {} // 實現 C
}
// Outer 間接擁有 A、B、C 三種類型能力