需要解释方法调用

时间:2014-03-27 08:42:36

标签: java interface method-call anonymous-inner-class

在下面的代码中:

public File[] findFiles (String path)
{
    FilenameFilter textFilter = new FilenameFilter()
    {
        @override
        public boolean accept(File dir, String name)
        {
            if(name.toLowerCase().endsWith(".txt"))
                return true;
            else
                return false;
        }
    };

    File[] txtFiles = new File(path).listFiles(textFilter);

    return txtFiles;
}

我理解实现接口FilenameFilter的匿名类是定义和实例化的。但我不明白如何调用方法accept而不直接调用。

3 个答案:

答案 0 :(得分:3)

如果您检查listFiles的源代码,则会调用accept方法。 here's the source code

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

答案 1 :(得分:2)

accept()方法在File.listFiles()方法中为在其调用的(目录)文件中找到的每个文件调用。

这是一个callback模式。

答案 2 :(得分:0)

FilenameFilter的实现需要覆盖accept方法,因为您已经这样做了。因此,当您使用listFiles( FilenameFilter filter )时,listFiles()方法中的过滤器会调用accept方法是否接受。

此链接有助于:http://docs.oracle.com/javase/7/docs/api/java/io/File.html#listFiles(java.io.FileFilter)