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

Java 匿名內部類完全指南:六大使用場景與語法細節

     編輯:Java 相關知識

為什麼用匿名內部類?

  1. 實現接口/擴展類,創建一次性實現對象並上溯造型返回。
  2. 解決複雜問題需輔助類,但不想公開類名。

六大場景代碼速覽

基礎接口:

interface Contents { int value(); }
interface Destination { String readLabel(); }
class Wrapping { Wrapping(int x) {} int value() { return 0; } }

1. 方法局部類

public Destination dest(String s) {
    class PDestination implements Destination { ... }
    return new PDestination(s);
}

類屬於方法作用域,外部不可見,但返回對象有效。

2. 任意作用域內部類

if (b) {
    class TrackingSlip { ... }
    TrackingSlip ts = new TrackingSlip("slip");
}
// 此處不可用 TrackingSlip

編譯時仍生成類,但作用域限制使用範圍。

3. 匿名類實現接口

public Contents cont() {
    return new Contents() { // 匿名實現 Contents
        private int i = 11;
        public int value() { return i; }
    }; // 分號結束表達式
}

等價於 class MyContents implements Contents ... return new MyContents();。

4. 匿名類擴展有參構造器的類

public Wrapping wrap(int x) {
    return new Wrapping(x) { // 調用基類構造器
        public int value() { return super.value() * 47; }
    };
}

基類構造器參數在 new Wrapping(x) 中傳遞。匿名類無構造器。

5. 匿名類字段初始化

public Destination dest(final String dest) {
    return new Destination() {
        private String label = dest; // 字段初始化
        public String readLabel() { return label; }
    };
}

使用外部變量必須 final(Java 8+ 隱式 final)。

6. 實例初始化塊模擬構造器

public Destination dest(final String dest, final float price) {
    return new Destination() {
        private int cost;
        { // 實例初始化塊 = 匿名類構造器
            cost = Math.round(price);
            if (cost > 100) println("Over budget!");
        }
        private String label = dest;
        public String readLabel() { return label; }
    };
}

初始化塊可執行任意語句(含 if),但不能重載,只能有一個「構造器」。

語法要點總結

  • 分號結束的是包含匿名類的表達式,非類體。
  • 匿名類不可有構造器,用字段初始化或實例初始化塊替代。
  • 捕獲外部變量需 final(或實際 final)。
  • 本質:new SuperType() { ... } 創建衍生類實例並上溯造型。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved