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

Java 內部類完全指南:成員、靜態、局部、匿名四大類型與最佳實踐

     編輯:Java 綜合教學

為什麼需要內部類?

內部類能直接訪問外部類所有成員(含 private),無需創建外部類實例即可操作外部狀態,實現「器官屬於身體」的強關聯建模。

四大類型對比

類型定義位置訪問外部成員實例化方式典型場景
成員內部類類內部、方法外全部(含非靜態)new Outer().new Inner()需頻繁訪問外部狀態的輔助類
靜態內部類類內部、static 修飾僅靜態成員new Outer.Inner()工具類、Builder 模式、不依賴外部實例
局部內部類方法/代碼塊內外部類成員 + final/effectively final 局部變數方法內 new Inner()臨時邏輯封裝、線程任務
匿名內部類表達式位置同局部內部類new Interface(){...} 或 new Parent(){...}事件監聽、策略模式、一次性實現

代碼演示

1. 成員內部類 — 訪問私有字段

class Outer {
    private int age = 12;
    class Inner {
        void print() { System.out.println(age); }
    }
}
Outer.Inner in = new Outer().new Inner(); // 需外部實例
in.print(); // 12

2. 變數遮蔽與 this 區分

class Outer {
    private int age = 12;
    class Inner {
        private int age = 13;
        void print(int age) { // 參數 age = 14
            System.out.println("局部參數:" + age);           // 14
            System.out.println("內部類字段:" + this.age);     // 13
            System.out.println("外部類字段:" + Outer.this.age); // 12
        }
    }
}

3. 靜態內部類 — 不依賴外部實例

class Outer {
    static int age = 12;
    static class Inner {
        void print() { System.out.println(age); }
    }
}
Outer.Inner in = new Outer.Inner(); // 直接 new
in.print(); // 12

4. 私有內部類 — 封裝內部實現

class Outer {
    private class Inner { void print() {} }
    void useInner() { new Inner().print(); } // 僅外部類可創建
}
// 外部無法 new Outer.Inner()

5. 方法局部內部類 — 捕獲 final 變數

class Outer {
    void doWork(final int param) {
        class Inner { void run() { System.out.println(param); } }
        new Inner().run();
    }
}

6. 匿名內部類 — 就地實現接口

Runnable r = new Runnable() {
    @Override public void run() { System.out.println("Hello"); }
};
new Thread(r).start();

編譯產物

  • Outer.class
  • Outer$Inner.class($ 代表內部類分隔符)
  • 匿名類:Outer$1.class、Outer$2.class...

最佳實踐

  1. 優先考慮 靜態內部類(無外部引用,不易洩漏)。
  2. 匿名類僅用於一次性、短小邏輯(< 20 行)。
  3. 避免在內部類持有大量外部狀態引用 → 記憶體洩漏風險。
  4. Lambda 表達式(JDK 8+)可替換大多數單方法匿名類,更簡潔。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved