定義於另一個類別內部的類別稱為巢狀類別,其作用域受外部類別限制。巢狀類別可存取外部類別所有成員(含 private),但外部類別無法直接存取巢狀類別成員。
巢狀類別分兩大類:
static 修飾詞。僅能透過外部類別實例存取非靜態成員,較少使用。class Outer {
int outer_x = 100;
void test() {
Inner inner = new Inner();
inner.display();
}
class Inner {
void display() { System.out.println("outer_x = " + outer_x); }
}
}
public class InnerClassDemo {
public static void main(String[] args) {
new Outer().test(); // 輸出: outer_x = 100
}
}
Inner 僅在 Outer 作用域可知,外部嘗試實例化將編譯錯誤。
內部類別可存取外部類別成員,反之不可。內部類別的實例變數(如 int y)對外部類別方法不可見。
內部類別可定義於方法、程式區塊、甚至 for 迴圈內:
void test() {
for (int i=0; i<10; i++) {
class Inner { void display() { System.out.println(outer_x); } }
new Inner().display();
}
}
此類別僅在該區塊內可見。匿名內部類別(無名稱)常用於事件處理、執行緒建立等場合,簡化程式碼。
巢狀類別於 Java 1.1 引入,1.0 版本不支援。