Java 中的匿名內部類

Shikha Chaudhary 2023年10月12日 Java Java Class
  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 中的匿名內部類通過提供可重用性和減少冗長,增加了語言的功能性和多功能性。

Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe

相關文章 - Java Class