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

Java 內部類完全指南:四大類型、語法細節與 JDK 源碼實戰模式

     編輯:Java 相關知識

核心定義

內部類:定義在另一個類內部的類。
外部類:包含內部類定義的類。
頂層類:非嵌套定義的普通類。

四大類型深度解析

1. 靜態成員類

public class Outer {
    public static class Inner1 { ... } // public
    static class Inner2 { ... }        // package-private
    private static class Inner3 {      // private
        public static class Inner4 { } // 嵌套靜態類
    }
}

特性:

  • 獨立於外部實例,無 Outer.this
  • 只能訪問外部 static 成員
  • 支持所有訪問修飾符
  • 只能定義在頂層或其他靜態成員類中
  • 引用語法:Outer.Inner1

JDK 實戰:LinkedList.Entry、HashMap.Node — 節點類僅服務於外部容器,無需外部實例上下文。

2. 成員類

public class Outer {
    private int data;
    public class Inner1 {
        private int data; // 隱藏外部同名字段
        public Inner1() {
            data = 1;           // 訪問自身字段
            Outer.this.data = 1; // 訪問外部字段
        }
    }
    private class Inner3 {
        public class Inner4 { } // 成員類可嵌套成員類
    }
    // 接口隱式 static
    interface Inner5 { } // 實為靜態成員類
}

特性:

  • 實例綁定外部實例,隱含 Outer.this 引用
  • 可訪問外部所有成員(含 private)
  • 不能定義 static 成員(static final 除外)
  • 不能是 interface
  • 實例化:Outer.Inner1 inner = outer.new Inner1();

JDK 實戰:AbstractList.Itr — 迭代器需訪問列表內部字段(size, modCount, elementData),無需額外暴露接口。

3. 局部類

public class Outer {
    private int instanceField;
    private static int staticField;
    { // 實例初始化塊
        int local1 = 0;
        final int local2 = 1;
        class Inner1 {
            public Inner1() {
                instanceField = 1; // 訪問外部實例字段
                // System.out.print(local1); // 編譯錯誤:非 final
                System.out.print(local2);  // 允許:final 或 effectively final
            }
        }
        // 無訪問修飾符
    }
    static { // 靜態初始化塊
        class Inner2 { // 局部靜態類
            public Inner2() { staticField = 1; }
        }
    }
    public void method() {
        class Inner3 { } // 方法局部類,僅在方法內可見
    }
}

核心約束:只能訪問 final/effectively final 局部變量(生命週期安全);無訪問修飾符;不能定義接口。

4. 匿名類

public class Outer {
    public void demo() {
        // 實現接口
        Action action = new Action() {
            public void doAction() { System.out.println("Anonymous"); }
        };
        action.doAction();
        // 繼承類
        new BaseClass(5) {
            public void printData() { System.out.println("data = " + getData()); }
        }.printData();
    }
}
interface Action { void doAction(); }
class BaseClass { 
    private int data;
    public BaseClass(int data) { this.data = data; }
    public int getData() { return data; }
}

本質:無構造器(使用實例初始化塊)、隱式繼承/實現、僅用於一次性行為定義。

選型決策樹

  1. 需訪問外部實例狀態? → 否 → 靜態成員類
  2. 是否長期使用/多處引用? → 是 → 成員類
  3. 是否僅在單一方法內使用? → 是 → 局部類
  4. 邏輯極簡且一次性? → 匿名類

內存洩漏警示

非靜態內部類實例持有外部引用。若內部類實例生命週期長於外部類(如靜態集合緩存、單例持有),將阻礙外部實例 GC。解決:改為靜態內部類 + 弱引用,或傳遞所需數據而非整個外部實例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved