內部類是 Java 實現多重繼承、封裝實現細節、簡化回調編程的利器。本文系統講解四大內部類型別的語法、訪問規則、實例化方式,並透過設計模式實戰展示其核心價值。
static 修飾outer.new Inner() 創建內部類對象OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
// 或在外部類非靜態方法中直接 new InnerClass()
OuterClass.this; // 在內部類中引用外部類實例
| 特性 | 成員內部類 | 靜態內部類 |
|---|---|---|
| 需外部類實例 | 是 | 否 |
| 訪問外部非靜態成員 | 直接訪問 | 不可直接訪問 |
| 可定義 static 成員 | 否 | 是 |
| 實例化語法 | outer.new Inner() | new Outer.Inner() |
final 或「實際上 final」的局部變量(JDK 8+ 隱含 final)「繼承類/實現介面」+「實例化」合二為一,無類名,隱含向上轉型:
// 介面式
Runnable r = new Runnable() {
@Override public void run() { System.out.println("執行中..."); }
};
// 繼承式
Thread t = new Thread() {
@Override public void run() { for(int i=1;i<=5;i++) System.out.print(i); }
};
t.start();
// 參數式(典型回調場景)
button.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) { /* 處理點擊 */ }
});
{} 替代)Java 單繼承限制下,內部類各自可繼承不同實現:
abstract class Reader { abstract void read(); }
abstract class Writer { abstract void write(); }
class Device {
// 內部類分別繼承 Reader、Writer
class USBReader extends Reader { void read() { /* USB讀取 */ } }
class USBWriter extends Writer { void write() { /* USB寫入 */ } }
// 對外暴露介面而非具體類
public Reader getReader() { return new USBReader(); }
public Writer getWriter() { return new USBWriter(); }
}
// 匿名內部類簡化線程創建
new Thread(() -> {
// 耗時操作
runOnUiThread(() -> textView.setText("完成")); // 另一個匿名內部類
}).start();
| 場景 | 推薦類型 |
|---|---|
| 需訪問外部實例狀態、邏輯複雜 | 成員內部類 |
| 獨立工具邏輯、單例持有者、Builder | 靜態內部類 |
| 方法內臨時邏輯、需捕獲 final 變量 | 局部內部類 |
| 一次性實現介面/繼承、回調、事件監聽 | 匿名內部類 |