匿名类java问题

匿名类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

我试图理解关于匿名类的论点。我在书中看到的例子要么没有论据,要么解释得不好。下面是代码(简而言之,来自Java第二版示例5-8,是的,我知道它很旧:-)

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()
  • list()通过使用两个参数调用其
    accept
    方法检查每个文件是否符合给定的筛选器(您的匿名类),即文件(文件f)和名称(字符串s)
  • accept()
    的实现决定是否接受此文件

  • 这两个参数都是由
    list
    方法在对传递给它的
    FilenameFilter
    匿名类的实例调用
    accept()
    时给出的

    原始流量:

  • f
    上调用
    list()
  • 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方法

    感谢您列出“引擎盖下”代码,这使我更加清楚。感谢您列出“引擎盖下”代码,这