首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 內部類與巢狀類完整指南:靜態嵌套類、內部類、區域類、匿名類

     編輯:Java 綜合教學

Java 內部類與巢狀類完整指南

Java 允許在類別內部定義另一個類別,稱為巢狀類。依修飾詞與定義位置分為四類:靜態嵌套類、內部類、區域類、匿名類。

1. 靜態嵌套類

  • 使用 static 修飾,與外部類實例無關
  • 只能存取外部類的 靜態成員
  • 建立方式:OuterClass.StaticNestedClass obj = new OuterClass.StaticNestedClass();

2. 內部類

  • 非靜態,隱含持有外部類實例引用
  • 可直接存取外部類的 所有成員(含私有)
  • 不能定義 static 成員(常數除外)
  • 建立方式:OuterClass outer = new OuterClass(); OuterClass.InnerClass inner = outer.new InnerClass();

3. 區域類

  • 定義在方法、建構子或程式碼區塊 {...} 內
  • 可存取外部類成員 + final 或 effectively final 的區域變數
  • Java 8 起支援 effectively final(未重新賦值的變數)
  • 不能定義 static 成員、介面

4. 匿名類

  • 無名稱,宣告與建立實例合為一句
  • 常用於實作介面或繼承類別的一次性實作
  • 語法:new InterfaceOrClass() { ... }
  • 存取規則同區域類

遮蔽示範

public class ShadowTest {
    public int x = 0;
    class FirstLevel {
        public int x = 1;
        void methodInFirstLevel(int x) {
            System.out.println("x = " + x);              // 參數 23
            System.out.println("this.x = " + this.x);    // 內部類欄位 1
            System.out.println("ShadowTest.this.x = " + ShadowTest.this.x); // 外部類欄位 0
        }
    }
    public static void main(String[] args) {
        new ShadowTest().new FirstLevel().methodInFirstLevel(23);
    }
}

輸出

x = 23
this.x = 1
ShadowTest.this.x = 0

序列化注意

強烈不建議序列化內部類,因其隱含外部類引用,序列化會連帶序列化外部類實例,導致資料膨脹與潛在安全風險。

匿名類實用範例

// 執行緒簡寫
new Thread(() -> System.out.println("Running")).start();

// Swing 事件監聽
button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        System.out.println("Clicked");
    }
});

比較總結

類型修飾詞存取外部實例成員可定義 static典型用途
靜態嵌套類static否是工具類、邏輯分組
內部類無是否迭代器、狀態綁定
區域類無是否方法內複雜邏輯封裝
匿名類無是否介面單次實作、事件監聽
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved