內部類是 Java 實現多重繼承、回調、封裝邏輯的關鍵機制,Android 源碼大量使用。本文系統梳理非靜態內部類、靜態內部類、局部內部類、匿名內部類的定義、編譯產物、實例化語法、訪問權限邊界,並深入剖析 OuterClass.this 與 InnerClass.this 的引用差異。
| 類型 | 定義位置 | 訪問外部成員 | 實例化語法 | 典型場景 |
|---|---|---|---|---|
| 非靜態內部類 | 類成員位置 | 任意(含 private) | new Outer().new Inner() | 需持有外部引用的狀態物件 |
| 靜態內部類 | 類成員位置 + static | 僅 static 成員 | new Outer.Inner() | 工具類、Builder、單例持有者 |
| 局部內部類 | 方法/代碼塊內 | final/Effectively final 變量 | 方法內直接 new | 臨時邏輯封裝、線程任務 |
| 匿名內部類 | 表達式位置 | 同局部內部類 | new Interface() { ... } | 事件監聽、Runnable、策略模式 |
OuterClass$InnerClass.class,獨立文件。private 成員(編譯器生成合成訪問器)。// 外部類非靜態方法中 InnerClass inner = new InnerClass(); // 隱含 this 引用 // 外部類靜態方法 / 外部其他類中 OuterClass.InnerClass inner = new OuterClass().new InnerClass(); // 顯式提供外部實例
this → 內部類實例本身。OuterClass.this → 外部類實例(唯一獲取外部實例的標準方式)。new Thread(new Runnable() {
@Override public void run() {
// 耗時任務
}
}).start();
掌握內部類機制,能讀懂 Android 源碼中 Handler、AsyncTask、View.setOnClickListener 等核心組件的設計精髓,也能寫出更優雅的回調與封裝代碼。