在 Java 中,當一個類的定義位於另一個類的內部時,這個內部的類就稱為內部類。內部類可以訪問外部類的所有成員(包括私有成員),這使得它成為實現封裝和邏輯分組的強大工具。
最常見的內部類形式是直接定義在類內部、方法外部的成員內部類。它可以使用 public、protected、private 或包級別的訪問修飾符。
非靜態內部類的實例必須依附於外部類的實例才能創建。語法如下:
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
// 或合寫為:
OuterClass.InnerClass inner = new OuterClass().new InnerClass();
注意:聲明內部類引用時必須使用 OuterClass.InnerClass 的完整形式。
若使用 static 修飾內部類,它就成為靜態內部類(實際上是巢狀類)。靜態內部類不需要外部類實例即可創建:
OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();
關鍵區別:
定義在方法內部或代碼塊內部的類稱為局部內部類。它的作用域僅限於該方法或塊內,外部不可見。
變量捕獲規則: 局部內部類只能訪問方法中被 final 修飾(或實際上不變)的局部變量。這是因為內部類實例的生命週期可能超過方法執行週期,需要複製變量值。
匿名內部類是沒有名稱的內部類,定義並實例化合二為一。常用於:
public/protected/private/static事件監聽器(GUI 開發):
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
執行緒快速啟動:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("在新執行緒中執行");
}
}).start();
內部類是 Java 面向對象特性的重要補充,合理使用能提高封裝性、可讀性與靈活性。掌握四種內部類的區別與適用場景,是進階 Java 開發的必備技能。