內部類是定義在另一個類內部的類。這種設計讓類之間的關係更緊密,同時能夠訪問外部類的私有成員,是 Java 封裝機制的重要補充。
public class Outer {
class Inner {
// 此時 Inner 就是內部類
}
}
內部類可以視為外部類的成員,因此可以使用 public、protected、private、static 等修飾符。根據定義位置和修飾符不同,分為四類:
static 修飾static 修飾定義:未使用 static 修飾的內部類,屬於外部類的對象,而非外部類本身。
創建方式:必須先有外部類對象,再通過外部類對象創建內部類對象。
Outer outer = new Outer(); Outer.Inner inner = outer.new Inner();
核心特點:
Outer.this.field 訪問外部類成員定義:使用 static 修飾,屬於外部類本身,不依賴外部類對象。
創建方式:可直接通過外部類類名訪問。
Outer.Inner inner = new Outer.Inner();
核心特點:
定義:定義在方法內,作用域僅限該方法,類似局部變量。
限制:不能使用 public、protected、private、static 修飾。
關鍵規則:訪問的局部變量必須是 final(Java 8+ 隱式 final)。原因是方法結束後棧幀銷毀,但內部類對象可能仍在堆中存活,需確保變量值不變。
定義:無名稱的局部內部類,適用於「只使用一次」的場景。
語法規則:
new Runnable() {
@Override
public void run() {
System.out.println("執行任務");
}
};
public class Outer {
public void someOuterMethod() { /* Line 3 */ }
public class Inner { }
public static void main(String[] argv) {
Outer o = new Outer(); // Line 8
}
}
/* 哪行能實例化 Inner?
A. new Inner(); // Line 3
B. new Inner(); // Line 8
C. new o.Inner(); // Line 8
D. new Outer.Inner(); // Line 8
*/
答案:A。Line 3 在實例方法中,隱含 this 引用,等價於 this.new Inner()。Line 8 在靜態方法中,必須用 o.new Inner()。
