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 中的匿名內部類通過提供可重用性和減少冗長,增加了語言的功能性和多功能性。