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

Java 內部類完整解析:成員內部類、靜態巢狀類、匿名內部類與封裝特性

     編輯:Java 相關知識

術語澄清

原文標題「外部類」實指 內部類。Java 中定義在另一個類內部的類稱為內部類,分四類:

  1. 成員內部類(非靜態)
  2. 靜態巢狀類(static 修飾)
  3. 方法局部內部類(定義在方法內)
  4. 匿名內部類(無名、單次使用)

成員內部類

public class Cow {
    private double weight;

    private class CowLeg { // private 修飾,外部不可見
        private double length;
        private String color;

        public void info() {
            System.out.println("牛腿顏色:" + color + ",長度:" + length);
            System.out.println("所屬奶牛重量:" + weight); // 直接訪問外部類 private 欄位
        }
    }

    public void test() {
        CowLeg leg = new CowLeg();
        leg.info();
    }
}

特性:

  • 可用 private/protected/public/default 修飾
  • 可直接訪問外部類所有成員(含 private)
  • 外部類訪問內部類需建立實例:new CowLeg()
  • 不能定義 static 成員(編譯錯誤)
  • 編譯產生 Outer$Inner.class

靜態巢狀類

public class Outer {
    private int instanceVar = 5;
    private static int staticVar = 9;

    static class StaticNested {
        public void access() {
            // System.out.println(instanceVar); // 編譯錯誤:靜態類不可訪問實例成員
            System.out.println(staticVar); // 僅可訪問外部類 static 成員
        }
    }
}

特性:

  • 屬於外部類本身,不依賴外部類實例
  • 可定義 static 與非 static 成員
  • 只能訪問外部類 static 成員
  • 實例化:new Outer.StaticNested()

匿名內部類

interface Product {
    double getPrice();
    String getName();
}

public class Demo {
    public void test(Product p) {
        System.out.println("購買:" + p.getName() + ",價格:" + p.getPrice());
    }

    public static void main(String[] args) {
        new Demo().test(new Product() { // 現場實作介面
            public double getPrice() { return 567.8; }
            public String getName() { return "RTX 4090"; }
        });
    }
}

規則:

  • 不能是抽象類(需立即建立實例)
  • 不能定義建構子(無類名)
  • 常用於事件監聽器、Runnable、Comparator 等單次實作

內部類封裝特性總結

特性成員內部類靜態巢狀類匿名內部類
訪問外部實例成員✓ 直接訪問✗ 僅 static✓ (若在實例方法中)
可定義 static 成員✗✓✗
需外部實例建立✓✗視上下文
修飾符支援全部static + 存取修飾符無
編譯產出Outer$Inner.classOuter$Nested.classOuter$1.class, Outer$2.class...

實戰應用場景

  • 成員內部類:實作外部類內部邏輯組件(如 Map 的 Entry、迭代器)
  • 靜態巢狀類:工具類、Builder 模式、資料傳輸物件
  • 匿名內部類:事件監聽、執行緒任務、策略模式臨時實作
  • Lambda 替代:Java 8+ 函數式介面優先用 Lambda,匿名類用於非函數式介面或多方法介面
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved