簡體   English   中英

方法參數內部具有重寫的類實例

[英]class instance with override inside method parameter

誰能幫我理解Java的此代碼塊

String [] files= file.list(new FilenameFilter() {
    @Override           
    public boolean accept(File dir, String name) {
        // TODO Auto-generated method stub
        return true;            
    }
});

這只是示例,我需要了解方法參數內部具有重寫方法的新實例的概念。

我了解此代碼的作用,但我需要了解概念*

看一下File.list(FilenameFilter filter)文檔

它以FilenameFilter作為參數,該參數又具有方法

boolean accept(File dir, String name)

您希望將新的FilenameFilter傳遞給該方法,並通過將其作為匿名類傳遞並覆蓋匿名類中accept方法來實現。

考慮您有一個帶有接口或抽象類作為參數的方法。 如果調用此方法,則必須傳遞指定類型的具體實例。 然后,一種可能性是在參數內創建一個實例。 這稱為匿名類

僅當您只需要一次此類時,才應該這樣做。

如果您在java.io.File中檢查list()的實際實現,則它看起來像這樣。

    public String[] list(FilenameFilter filter) {
    String names[] = list();
    if ((names == null) || (filter == null)) {
        return names;
    }
    List<String> v = new ArrayList<>();
    for (int i = 0 ; i < names.length ; i++) {
        if (filter.accept(this, names[i])) {
            v.add(names[i]);
        }
    }
    return v.toArray(new String[v.size()]);
}

該方法需要任何實現FilenameFilter的實例。 在File.list()方法內部執行的操作是調用filter參數的accept()。 並且實際上執行調用方的原始實現。 因此,這意味着您在這種情況下提供的覆蓋的方法內容。

這稱為匿名內部類

在Java中,沒有名稱的類稱為匿名內部類。 如果必須重寫類或接口的方法,則應使用它。

暫無
暫無

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

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