我正在尝试理解有关匿名类的参数。在我看过的书中的例子要么没有论据,要么不能很好地解释它们。这是代码(来自Java的Nutshell第2版示例5-8,是的,我知道它已经过时了: - )......
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应用于'accept'的'File f'参数,以及'String s'参数来自何处?为什么调用'accept'方法,是否可能来自FilenameFilter构造函数?
谢谢!
答案 0 :(得分: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()]);
}
调用给定文件名过滤器的accept方法。字符串s在您的示例names[i]
中。
list()
返回一个字符串数组,用于命名文件路径名表示的目录中的文件和目录。
解释你的代码:
String[] list = f.list(new FilenameFilter() {
public boolean accept(File f, String s) {
return s.endsWith(".java");
}
});
使用带有accept方法实现的FilenameFilter接口的新匿名类调用File类的list方法(参见上文)。
答案 1 :(得分:1)
accept
的参数独立于方法中的局部变量,与其无关。
代码令人困惑。它应该是这样的:
File f = new File(args[0]);
String[] list = f.list(new FilenameFilter() {
public boolean accept(File file, String s) {
return s.endsWith(".java");
}
});
从accept
方法中调用FilenameFilter
的{{1}}方法。
答案 2 :(得分:1)
当list
方法在您传递给它的accept()
匿名类的实例上调用FilenameFilter
时,这两个参数都会给出。
原始流程:
list()
上致电f
。accept
方法来检查每个文件是否符合给定的过滤器(您的匿名类)accept()
的实施决定是否接受此文件。答案 3 :(得分:1)
这里棘手的是你创建了一个FilenameFilter,但是使用了一个特定的accept
方法,然后传递给f.list(FilenameFilter filenameFilter)
。
f.list
中的代码知道如何调用FilenameFilter中的accept方法,并使用当前文件(File f)及其名称(String s)来查看当前候选者是否应该在结果与否。
File f = new File(args[0])
与File f
的{{1}}参数无关。它们在您的代码中只有相同的名称。
换句话说,您使用accept(...)
覆盖创建自己的一次性FilenameFilter子类,并在使用它的地方执行。 accept方法有两个accept
知道如何提供的参数。
答案 4 :(得分:1)
FilenameFilter是一个接口。执行new FileNameFilter()
时,您将创建此接口的新实现。
您可以将其创建为常规类,而不是在代码中内联。
答案 5 :(得分:1)
list
File
方法调用您在目录中找到的每个文件传递给它的accept
对象的FilenameFilter
方法。