匿名类java问题

时间:2011-08-02 23:15:46

标签: java class

我正在尝试理解有关匿名类的参数。在我看过的书中的例子要么没有论据,要么不能很好地解释它们。这是代码(来自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构造函数?
谢谢!

6 个答案:

答案 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)

不幸的是巧合。两个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");  
    }  
}); 

accept方法中调用FilenameFilter的{​​{1}}方法。

答案 2 :(得分:1)

list方法在您传递给它的accept()匿名类的实例上调用FilenameFilter时,这两个参数都会给出。

原始流程:

  1. 您在list()上致电f
  2. list()通过使用两个参数(文件f)及其名称(String s)调用其accept方法来检查每个文件是否符合给定的过滤器(您的匿名类)
  3. 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方法。