靜態內部類是指在外部類內部以 static 修飾宣告的類別。與一般內部類不同,它不依附於外部類的實例,因此:
this 參考外部類實例。public class OuterClass {
private double x = 0.0; // 實例變數
static private int n = 10; // 靜態變數
static void outerMethod() { // 靜態方法
System.out.println("from OuterClass...");
}
void outerMethod2() { // 實例方法
System.out.println("from OuterClass instance method...");
}
static class StaticInnerClass { // 靜態內部類
static private int m = 5; // 靜態內部類的靜態變數
static void innerMethod() { // 靜態方法
n = 20; // ✅ 可存取外部靜態變數
int sum = n + m;
System.out.println("from InnerClass sum = " + sum);
outerMethod(); // ✅ 可呼叫外部靜態方法
// x = 1.0; // ❌ 編譯錯誤:無法存取實例變數
// outerMethod2(); // ❌ 編譯錯誤:無法呼叫實例方法
}
int innerMethod2() { // 實例方法
n = 100; // ✅ 仍只能存取靜態成員
outerMethod();
System.out.println("from InnerMethod2() n = " + n);
return n;
}
}
}
OuterClass.StaticInnerClass.innerMethod(); // 無需建立任何實例
OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();
int result = inner.innerMethod2();
inner.innerMethod(); // 編譯器會發出警告,建議用類別名呼叫
當內部類不需要存取外部類的實例狀態時,應優先考慮 static 修飾。這不僅能明確表達設計意圖,也能避免隱含持有外部類實例參考導致的記憶體洩漏風險。