簡體   English   中英

Java,匿名內部類定義

[英]Java, anonymous inner class definition

我在 Java 中看到了幾個與此類似的示例,希望有人能解釋發生了什么。 似乎可以內聯定義一個新類,這對我來說似乎很奇怪。

第一個打印輸出行是預期的,因為它只是 toString。 然而,第二個似乎可以內聯覆蓋該函數。

這有技術術語嗎?
或者任何更深入的文檔?

如果我有以下代碼:

public class Apple {
    public String toString() {
        return "original apple";
    }
}

public class Driver {
    public static void main(String[] args) {
        System.out.println("first: " + new Apple());
        System.out.println("second: " + 
            new Apple() {
                public String toString() {
                    return "modified apple";
                }
            }
        );
    }
}

代碼輸出:

first: original apple
second: modified apple

它是一個匿名內部類。 您可以在內部類的 Java 文檔鏈接中找到有關它的更多信息。 編輯我正在添加一個 更好的鏈接來描述匿名內部類,因為 Java 文檔有一些不足之處。 /編輯

大多數人會使用匿名內部類來動態定義偵聽器。 考慮這個場景:

我有一個Button ,當我點擊它時,我希望它向控制台顯示一些東西。 但是我不想在不同的文件中創建一個新類,我不想稍后在這個文件中定義一個內部類,我希望邏輯在這里立即可用。

class Example {
    Button button = new SomeButton();

    public void example() {
        button.setOnClickListener(new OnClickListener() {
            public void onClick(SomeClickEvent clickEvent) {
                System.out.println("A click happened at " + clickEvent.getClickTime());
            }
        });
    }

    interface OnClickListener {
        void onClick(SomeClickEvent clickEvent);
    }

    interface Button {
        void setOnClickListener(OnClickListener ocl);
    }
}

這個例子有點做作,顯然不完整,但我認為它傳達了這個想法。

您的代碼中發生的事情是您使用匿名內部類隱式繼承Apple並覆蓋其toString()方法。

它被稱為匿名內部類,您可以在此處此處閱讀有關它的信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM