匿名类java问题
我试图理解关于匿名类的论点。我在书中看到的例子要么没有论据,要么解释得不好。下面是代码(简而言之,来自Java第二版示例5-8,是的,我知道它很旧:-)匿名类java问题,java,class,Java,Class,我试图理解关于匿名类的论点。我在书中看到的例子要么没有论据,要么解释得不好。下面是代码(简而言之,来自Java第二版示例5-8,是的,我知道它很旧:-) import java.io.*; //打印出目录中的所有*.java文件。 公共静态void main(字符串[]args) { 文件f=新文件(args[0]); String[]list=f.list(新文件名过滤器(){ 公共布尔接受(文件f,字符串s){ 返回s.endsWith(“.java”); } }); for(i
import java.io.*;
//打印出目录中的所有*.java文件。
公共静态void main(字符串[]args)
{
文件f=新文件(args[0]);
String[]list=f.list(新文件名过滤器(){
公共布尔接受(文件f,字符串s){
返回s.endsWith(“.java”);
}
});
for(int i=0;i
我的问题是文件名f如何应用于'accept'的'File f'参数,以及'String s'参数从何而来?为什么要调用“accept”方法,它可能来自FilenameFilter构造函数谢谢 不幸的巧合。两个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");
}
});
FilenameFilter
的accept
方法是从File.list
方法中调用的。两个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");
}
});
FilenameFilter
的accept
方法是从File.list
方法中调用的。这两个参数都是由list
方法在调用传递给它的FilenameFilter
匿名类的实例时给出的
原始流量:
f
上调用list()
accept
方法检查每个文件是否符合给定的筛选器(您的匿名类),即文件(文件f)和名称(字符串s)accept()
的实现决定是否接受此文件这两个参数都是由
list
方法在对传递给它的FilenameFilter
匿名类的实例调用accept()
时给出的
原始流量:
f
上调用list()
accept
方法检查每个文件是否符合给定的筛选器(您的匿名类),即文件(文件f)和名称(字符串s)accept()
的实现决定是否接受此文件这里需要技巧的是,您创建了一个FilenameFilter,但是使用了一个特定的
accept
方法,然后将该方法传递给f.list(FilenameFilter FilenameFilter)
f.list
中的代码知道如何使用每个文件的当前文件(文件f)及其名称(字符串s)调用FilenameFilter中的accept方法,以确定当前候选文件是否应出现在结果中
File f=new File(args[0])
与File f
的accept(…)
参数无关。它们只是在代码中有相同的名称
换句话说,您可以创建自己的一次性FilenameFilter子类,覆盖一个
accept
,并在使用它的地方执行它。accept方法接受两个参数,File.list()
知道如何提供。这里的棘手问题是,您创建了一个FilenameFilter,但使用了一个特定的accept
方法,然后将该方法传递给f.list(FilenameFilter FilenameFilter)
f.list
中的代码知道如何使用每个文件的当前文件(文件f)及其名称(字符串s)调用FilenameFilter中的accept方法,以确定当前候选文件是否应出现在结果中
File f=new File(args[0])
与File f
的accept(…)
参数无关。它们只是在代码中有相同的名称
换句话说,您可以创建自己的一次性FilenameFilter子类,覆盖一个
accept
,并在使用它的地方执行它。accept方法接受两个参数,File.list()
知道如何提供。FilenameFilter是一个接口。执行newfilenamefilter()
操作时,将创建此接口的新实现
您可以将其创建为常规类,而不是在代码中内联执行。FilenameFilter是一个接口。执行
newfilenamefilter()
操作时,将创建此接口的新实现
您可以将其创建为一个常规类,而不是在代码中内联执行。File的
list
方法调用FilenameFilter
对象的accept
方法,您为在目录中找到的每个文件传递给它。File
的list
方法调用accept
为目录中找到的每个文件传递给它的FilenameFilter
对象的方法。如果查看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方法实现的FilenameFilter接口的新匿名类调用File类(参见上文)的list方法 如果查看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方法实现的FilenameFilter接口的新匿名类调用File类(参见上文)的list方法 感谢您列出“引擎盖下”代码,这使我更加清楚。感谢您列出“引擎盖下”代码,这