簡體   English   中英

參數中的Java“ new”關鍵字

[英]Java “new” keyword in parameter

最近,我一直在研究許多OOP設計模式,並且遇到了一些以前從未見過的奇怪事情:

Button button =  new Button(shell, SWT.PUSH);
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
    // Handle the selection event
    System.out.println("Called!");
    }
}); 

具體來說,這是做什么的(例如,“ new”關鍵字在這里做什么)?

    button.addSelectionListener(new SelectionAdapter() {

第二個問題:

private void notifyListeners(Object object, String property, String oldValue, String newValue) {
   for (PropertyChangeListener name : listener) {
      name.propertyChange(new PropertyChangeEvent(this, "firstName", oldValue, newValue));
   }
}

這是觀察者設計模式的摘要。 以我的新理解,name.propertyChange(...)創建一個PropertyChangeEvent對象,並通過Java的觀察者模式實現,通過將該新對象的信息發送給觀察者(或與此類似的事物)來自動通知觀察者。 它是否正確?

在這里, new關鍵字正在創建一個匿名類。

當您需要一個偵聽器來執行某些操作,並且希望將代碼分組在一起,並且/或者該類是“一次性”時,這很有用,這意味着它在其他地方沒有用。

這是指向匿名類的sun教程的鏈接 所有正常的班級規則均適用。 創建接口時,您需要實現抽象方法或所有方法。

范圍稍有不同,因為您可以訪問嵌套在您的匿名類中的類中聲明的變量。 但是,您不能從匿名類訪問局部變量,除非這些局部變量被聲明為final。 例如:

Button button =  new Button(shell, SWT.PUSH);
final String someString = "hello world!";
button.addSelectionListener(new SelectionAdapter() { 
    @Override
    public void widgetSelected(SelectionEvent e) {
        // Handle the selection event
        System.out.println(someString);
    }
});

如果在更全局的范圍內聲明someString則不是這種情況。

關於第二個問題:

是。 您是正確的,這就是代碼段中正在發生的事情。 注意到每次都會創建一個新的PropertyChangeEvent嗎? 這樣一來,出現在列表前面的偵聽器就不會為列表后面出現的項修改PropertyChangeEvent

首先,這是Java特定的語法:C#中沒有可比的語法,您必須在其中創建一個匿名類擴展object ,或者創建一個命名類的實例。

在Java中,此語法使您可以創建SelectionAdapter的匿名子類,並在您認為合適的情況下覆蓋任何方法。 這等效於創建一個擴展了SelectionAdapter的命名類,該類將覆蓋任何方法,就像在SelectionAdapter()構造函數調用之后的花括號中所做的那樣,然后在addSelectionListener調用中使用該派生類的名稱。 唯一的區別是,此類派生類將具有名稱,而示例中的匿名類沒有名稱*供程序員使用。

*內部匿名類確實具有名稱:如果查看Java編譯器生成的類文件列表,則可以看到它們。 名稱中帶有美元符號和數字的文件對應於匿名類。

new關鍵字正在創建一個匿名對象。

當您要創建僅使用一次的實例時,此功能很有用。

暫無
暫無

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

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