2011-08-02 80 views
1

我想了解有關匿名類的參數。我見過的書中的例子要麼沒有爭論,要麼不能很好地解釋它們。下面的代碼(果殼中的第2版例子5-8從Java是的,我知道這是老: - )...匿名類java問題

import java.io.*; 

//Print out all the *.java files in the directory. 
public static void main(String[] args) 
{ 
    File f = new File(args[0]); 
    String[] list = f.list(new FilenameFilter() { 
    public boolean accept(File f, String s) { 
     return s.endsWith(".java"); 
    } 
    }); 
    for (int i = 0; i < list.length; i++) 
    System.out.println(list[i]); 
    } 
} 

我的問題是文件名˚F如何被應用到「文件f」參數'接受',還有'String s'論點來自哪裏?爲什麼'accept'方法被調用,它是來自FilenameFilter構造函數嗎?
謝謝!

回答

3

,如果你看一看到Java API的源文件,你會發現在File.java如下:

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()]); 
     } 

這就要求給定的文件名過濾器的接受方法。字符串s在你的例子names[i]中。 list()返回一個字符串數組,命名文件路徑名錶示的目錄中的文件和目錄。

來解釋你的代碼:

String[] list = f.list(new FilenameFilter() { 
    public boolean accept(File f, String s) { 
     return s.endsWith(".java"); 
    } 
    }); 

調用File類的一個新的匿名類的FilenameFilter接口與accept方法的實現列表方法(見上文)。

+0

感謝您列舉'引擎蓋下'的代碼,這讓我對它更加清楚。 –

1

不幸的巧合。這兩個f彼此無關:accept的參數與方法中的局部變量無關,並且與該變量無關。

代碼很混亂。它應該是這樣的:

File f = new File(args[0]); 
String[] list = f.list(new FilenameFilter() { 
    public boolean accept(File file, String s) { 
     return s.endsWith(".java"); 
    } 
}); 

FilenameFilteraccept方法是從File.list方法中調用。

+0

我最初被這兩個f弄糊塗了,但過了一段時間,我錯過的部分就是'底層'代碼。謝謝! –

1

這兩個參數都由list方法在FilenameFilter匿名類的實例上調用accept()時給出。

原始流量:

  1. f調用list()
  2. 列表()檢查通過調用其accept方法有兩個參數,文件(文件F),它的名字(String s)將
  3. 你實現accept()決定是否每個文件是否符合給定的過濾器(您的匿名類)這個文件應該被接受與否。
+0

原始流量很有幫助! –

1

這裏的棘手的事情是創建了FilenameFilter但具體accept方法,然後將其傳遞給f.list(FilenameFilter filenameFilter)

f.list的代碼知道如何調用接受的了FilenameFilter方法與當前文件(文件F),它的名字(String s)將進行考慮,以確定目前的候選人應在結果與否的每個文件。

File f = new File(args[0])與參數accept(...)File f不相關。他們在你的代碼中只有相同的名字。

換句話說,您可以用accept重寫來創建自己的一次性FilenameFilter子類,並在使用它的位置執行此操作。 accept方法有兩個參數,其中File.list()知道如何提供。

1

FilenameFilter是一個接口。當你做new FileNameFilter()時,你創建了這個接口的一個新的實現。

您可以將其創建爲普通類而不是在代碼中內聯。

1

方法File調用FilenameFilter對象的accept方法,該對象將傳遞給它在目錄中找到的每個文件。