內部類是定義在另一個類或方法內部的類,主要作用是封裝邏輯、實現多重繼承效果、提供對外部類成員的便捷訪問。Java 提供四種類型:成員內部類、局部內部類、匿名內部類、靜態內部類,各有適用場景。
定義在外部類成員位置(與字段、方法平級),不帶 static 修飾。
private/protected/public/默認 修飾(外部類只能 public/默認)// 方式一:外部類實例.new 內部類()
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
// 方式二:在外部類非靜態方法中直接 new Inner()
public Inner getInner() { return new Inner(); }
內部類有與外部類同名字段/方法時,默認訪問內部類自己的。訪問外部類需用 OuterClass.this.field 或 OuterClass.this.method()。
定義在方法內部或代碼塊內,作用域僅限於該方法/塊內。
public/protected/private/static 修飾符(類似局部變量)final 或實際上 final 的局部變量(JDK 8+ 隱式 final)Outer$1Inner.class 等類文件無名類,聲明並創建實例合二為一,語法:new Interface/Class() { ... }。
Outer$1.class、Outer$2.class…Mapprices = Maps.newHashMap(); prices.put("apple", 4.5); prices.put("bear", 6.3); // 匿名內部類實現 Function 接口 Map usdPrices = Maps.transformValues(prices, new Function () { private static final double RATE = 0.1544; @Override public Double apply(Double input) { return RATE * input; // 人民幣轉美元 } }); // JDK 8+ 可簡化為 Lambda: input -> RATE * input
帶 static 修飾的成員內部類,不依賴外部類實例。
| 特性 | 成員內部類 | 靜態內部類 |
|---|---|---|
| 依賴外部實例 | 是 | 否 |
| 訪問外部非靜態成員 | 直接訪問 | 不可直接訪問(需外部實例) |
| 訪問外部靜態成員 | 直接訪問 | 直接訪問 |
| 創建語法 | outer.new Inner() | new Outer.StaticInner() |
| 典型用途 | 需要外部狀態的輔助類 | 獨立工具類、Builder 模式、單例持有者 |
public class Singleton {
private Singleton() {}
private static class Holder {
static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}
Outer$Inner.classOuter$StaticInner.classOuter$1Local.class(方法內編號)Outer$1.class、Outer$2.class…內部類是 Java 面向對象建模的強大補充。成員內部類適合緊密綁定外部狀態的輔助類;靜態內部類是獨立組件、Builder、單例的首選;匿名內部類在函數式接口場景下(JDK 8 前)不可或缺;局部內部類用於方法級邏輯封裝。理解其生命週期、訪問規則、編譯產物,能寫出更安全、優雅的代碼。