匿名內部類
匿名內部類是一種內部類,使用單個語句宣告和例項化。因此,該類的其他地方沒有名稱可供使用; 即它是匿名的。
匿名類通常用於需要能夠建立輕量級類作為引數傳遞的情況。這通常通過介面完成。例如:
public static Comparator<String> CASE_INSENSITIVE =
new Comparator<String>() {
@Override
public int compare(String string1, String string2) {
return string1.toUpperCase().compareTo(string2.toUpperCase());
}
};
這個匿名類定義了一個 Comparator<String>
物件(CASE_INSENSITIVE
),用於比較兩個字串,忽略大小寫的差異。
經常使用匿名類實現和例項化的其他介面是 Runnable
和 Callable
。例如:
// An anonymous Runnable class is used to provide an instance that the Thread
// will run when started.
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello world");
}
});
t.start(); // Prints "Hello world"
匿名內部類也可以基於類。在這種情況下,匿名類隱含地顯示現有類。如果要擴充套件的類是抽象的,那麼匿名類必須實現所有抽象方法。它也可能會覆蓋非抽象方法。
建構函式
匿名類不能有顯式建構函式。相反,定義了一個隱式建構函式,它使用 super(...)
將任何引數傳遞給正在擴充套件的類中的建構函式。例如:
SomeClass anon = new SomeClass(1, "happiness") {
@Override
public int someMethod(int arg) {
// do something
}
};
我們的 SomeClass
的匿名子類的隱式建構函式將呼叫與呼叫簽名 SomeClass(int, String)
匹配的 SomeClass
的建構函式。如果沒有可用的建構函式,則會出現編譯錯誤。隱式建構函式也會丟擲匹配的建構函式丟擲的任何異常。
當然,擴充套件介面時這不起作用。當你從介面建立匿名類時,類超類是 java.lang.Object
,它只有一個 no-args 建構函式。