public class Outer {
static class Inner {
public static void staticMethod() { System.out.println(\"Inner static\"); }
}
}
public class Main {
public static void main(String[] args) {
// Outer.Inner.staticMethod(); // 編譯錯誤?
new Outer().new Inner().staticMethod(); // 需建立外部類實例?
}
}
正確寫法: Outer.Inner.staticMethod(); — 靜態內部類的靜態成員可直接用「外部類.內部類.靜態成員」訪問,無需任何實例。
static 修飾符,內部類變為非靜態內部類(成員內部類),確實需要外部類實例才能實例化內部類,進而調用其靜態方法(雖然靜態方法屬於類,但語法要求先有內部類型)。| 類型 | 定義位置 | 需外部實例? | 可訪問外部私有成員? | 可定義靜態成員? |
|---|---|---|---|---|
| 靜態內部類 | 類體內,static class | 否 | 是(透過外部類類名) | 是 |
| 成員內部類 | 類體內,無 static | 是 | 是(含非靜態) | 否(JDK 16+ 允許) |
| 區域內部類 | 方法/塊內 | 是(隱含) | 僅 final/效果 final 區域變數 | 否 |
| 匿名內部類 | 表達式中 | 是 | 同區域內部類 | 否 |
類名.方法名(),勿用實例調用(雖合法但語意混淆)。原意:皮毛依附於皮革。對應關係:非靜態內部類實例依附於外部類實例。靜態內部類不依附,故無此限制。