2017-03-02 48 views
2

任何一個可以幫我瞭解java類實例

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

的這個代碼塊這僅僅是例子,我需要了解新的實例與方法的參數內覆蓋方法的概念。

我明白這是什麼代碼做的,但我需要了解*

+0

它創建一個[匿名類](https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html),實現'FilenameFilter'界面 – UnholySheep

+0

我認爲你應該閱讀[匿名類Java文檔](https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html) –

+0

https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html –

回答

-2

這就是所謂的匿名內部類

沒有名稱被稱爲Java中的匿名內部類的類的概念。如果必須覆蓋類或接口的方法,應該使用它。

+0

這只是匿名課程。不是內心階層。內部類和匿名類是不同的。當然,你可以有一個同時在一起的課程,但據我們所知,情況並非如此。 –

0

看一下File.list(FilenameFilter filter)documentation

它需要一個FilenameFilter作爲參數,這反過來方法

boolean accept(File dir, String name)

你想傳遞一個新的FilenameFilter的方法和你做,通過把它當作一個anonymous class和重寫accept方法在匿名類中。

0

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

只有當你只需要這個類時,你應該這樣做。

0

如果您在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()。哪個實際執行調用者的原始實現。這意味着您在這種情況下提供的重寫方法內容。