Java 中的匿名內部類

Shikha Chaudhary 2023年10月12日
  1. Java 中的匿名內部類
  2. Java 中匿名內部類的變數和成員
  3. 在 Java 中建立匿名內部類
  4. Java 中不同型別的匿名內部類
  5. Java 中匿名內部類的優點
  6. まとめ
Java 中的匿名內部類

本文討論 Java 中的 Anonymous Inner 類及其用途。

Java 中的匿名內部類

匿名這個詞的意思是 - 未知的名字。Java 匿名內部類也是如此。

沒有名稱且我們只需要為其建立單個物件的內部類稱為 Java 匿名內部類。當我們必須做一些額外的事情(例如從類或介面過載方法)時必須建立物件的例項時,它很有用。

我們可以通過使用 Java 匿名內部類來做到這一點,而無需建立該類的子類。

換句話說,一個沒有名字的類被稱為 Java 匿名內部類。通常,每當我們建立一個新類時,它都有一個名稱。

因此,Java 匿名內部類不用於建立新類。相反,我們用於覆蓋類或介面的方法。

它們在圖形程式設計中也很有用,我們為偵聽器介面編寫實現類。

Java 匿名內部類的語法類似於建構函式的呼叫,只是類定義也存在於程式碼塊中。

語法:

Demo d = new Demo() {
  public void demo_method() {
    // definition
  }
};

這裡,demo 指的是一個抽象/具體的類或一個介面。為了更好地理解匿名內部類的概念,讓我們看看它與常規 Java 類有何不同。

  • 我們可以使用普通類實現任意數量的介面,但匿名內部類一次只能實現一個介面。
  • 一個常規類可以擴充套件另一個類並同時實現多個介面。而另一方面,匿名內部類一次只能做這些事情中的一件。
  • 建構函式的名稱與類的名稱相同。這意味著我們可以在常規類中編寫任意數量的建構函式,但對於匿名內部類則不然。

要了解有關 Java 內部類的更多資訊,請參閱此文件

Java 中匿名內部類的變數和成員

匿名內部類也像 Java 中的任何本地類一樣捕獲變數。對區域性變數的訪問與封閉類相同。

封閉類的成員可由匿名類訪問。但是,它不能訪問那些不是 final 的區域性變數(即使是那些存在於其封閉範圍內的變數)。

此外,如果我們在匿名類中宣告任何型別,它會隱藏在該範圍內具有相同名稱的其他宣告。匿名內部類也有一些限制。

  • 匿名內部類不允許宣告靜態初始化器或成員介面。
  • 如果靜態成員是常量變數,它們可以是匿名類的一部分。

它得出的結論是,我們可以在匿名類中宣告一個欄位、額外的方法、例項初始化程式和本地類。

在 Java 中建立匿名內部類

我們可以使用兩種主要方法來建立匿名內部類。這些包括使用:

  • 一個類(抽象或具體)
  • 一個介面

讓我們一一看看。

在 Java 中使用類建立匿名內部類

首先,看下面的例子。

abstract class Demo {
  abstract void demo();
}
class AnonymousDemo {
  public static void main(String args[]) {
    Demo d = new Demo() {
      void demo() {
        System.out.println("This is a demo of an anonymous inner class using  class.");
      }
    };
    d.demo();
  }
}

輸出:

This is a demo of an anonymous inner class using class.

在這裡,建立了一個類,其名稱由編譯器決定。該類擴充套件了 Demo 類並實現了 demo() 方法。

匿名類的物件是 d。它是匿名型別 Demo 類的引用變數。請注意,我們將其儲存為 AnonymousDemo.java 以進行編譯。

下面的程式碼是編譯器如何生成內部類。

import java.io.PrintStream;
static class AnonymousDemo$1 extends Demo {
  AnonymousDemo$1() {}
  void demo() {
    System.out.println("This is a demo of an anonymous inner class using class.");
  }
}

在 Java 中使用介面建立匿名內部類

在上一節中,我們使用了一個類。但是在這裡,我們將使用匿名內部類的介面。讓我們通過一個例子來理解這一點。

interface Demonstration {
  void demo();
}
class AnonymousDemo {
  public static void main(String args[]) {
    Demonstration d = new Demonstration() {
      public void demo() {
        System.out.println("This is an example of an anonymous inner class using an interface.");
      }
    };
    d.demo();
  }
}

輸出:

This is an example of an Anonymous inner class using an interface.

在這裡,建立了一個類,其名稱由編譯器決定。這個類實現了介面 Demonstration 並給出了 demo() 方法的實現。

匿名類的物件是 d。它是 Demonstration 型別的引用變數。請注意,我們將其儲存為 AnonymousDemo.java 以進行編譯。

下面的程式碼是編譯器如何生成內部類。

import java.io.PrintStream;
static class AnonymousDemo$1 implements Demonstration {
  AnonymousDemo$1() {}
  void demo() {
    System.out.println("This is an example of an anonymous inner class using an interface.");
  }
}

Java 中不同型別的匿名內部類

匿名內部類根據宣告和行為分為 3 種型別。

  • 擴充套件類的匿名內部類。
  • 實現介面的匿名內部類。
  • 匿名內部類在方法/建構函式引數中定義。

讓我們一一討論這三種型別。

在 Java 中擴充套件類的匿名內部類

我們可以通過擴充套件一個 Thread 類來建立一個執行緒,我們也可以有一個匿名的內部類來擴充套件一個類。

我們在這裡使用 new 關鍵字來建立一個引用父類型別的物件。看下面的例子。

class Demo {
  public void example() {
    System.out.println("Types of Anonymous classes");
  }
}
public class AnonymousDemo {
  public static void main(String args[]) {
    Demo d1 = new Demo();
    d1.example();
    Demo d2 = new Demo() {
      @Override
      public void example() {
        System.out.println("Type - 1");
      }
    };
    d2.example();
  }
}

輸出:

Types of Anonymous classes
Type - 1

在 Java 中實現介面的匿名內部類

我們可以通過實現 Runnable 介面來建立執行緒,匿名內部類也可以實現介面。我們使用 new 關鍵字來建立一個引用介面型別的匿名內部類物件。

interface Demo {
  public void demo();
}
public class AnonymousDemo {
  public static void main(String args[]) {
    Demo d = new Demo() {
      @Override
      public void demo() {
        System.out.println("Type - 2");
      }
    };
    d.demo();
    System.out.println(d.getClass().getName());
  }
}

輸出:

Type - 2
AnonymousDemo$1

Java 中方法/建構函式引數中的匿名內部類

方法或建構函式引數中的匿名內部類可用於 GUI(圖形使用者介面)應用程式。在這裡,我們使用匿名內部類作為引數並將其傳遞給方法或建構函式。

這是一個例子。

abstract class Demo {
  public abstract void demo();
}
class Example {
  public void example(Demo d) {
    d.demo();
  }
}
public class AnonymousDemo {
  public static void main(String args[]) {
    Example e = new Example();
    e.example(new Demo() {
      @Override
      public void demo() {
        System.out.println("Type - 3");
      }
    });
  }
}

輸出:

Type - 3

Java 中匿名內部類的優點

匿名內部類關閉了方法的區域性變數,這是對內部類的額外優勢。此外,這些類減少了冗長並提供了可重用性。

此外,這些類可以幫助開發人員,因為他們不必自己為每個類查詢名稱。我們可以同時使用匿名內部類宣告和例項化一個類。

總的來說,匿名內部類是 Java 的優勢之一。

要了解有關 Java 中匿名內部類的更多資訊,請參閱此文件

まとめ

在本文中,我們討論了 Java 匿名內部類。我們看到了常規類和匿名內部類之間的區別。

我們還討論了 Java 匿名內部類的用法和優點。此外,我們通過程式碼和示例瞭解了實現和語法。我們甚至瞭解了各種型別的 Java 匿名內部類。

總之,Java 中的匿名內部類通過提供可重用性和減少冗長,增加了語言的功能性和多功能性。

相關文章 - Java Class