匿名內部類

匿名內部類是一種內部類,使用單個語句宣告和例項化。因此,該類的其他地方沒有名稱可供使用; 即它是匿名的。

匿名類通常用於需要能夠建立輕量級類作為引數傳遞的情況。這通常通過介面完成。例如:

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),用於比較兩個字串,忽略大小寫的差異。

經常使用匿名類實現和例項化的其他介面是 RunnableCallable。例如:

// 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 建構函式。