class 方法参数内覆盖的实例

class instance with override inside method parameter

谁能帮我理解 java

的这个代码块
String [] files= file.list(new FilenameFilter() {
    @Override           
    public boolean accept(File dir, String name) {
        // TODO Auto-generated method stub
        return true;            
    }
});

这只是一个示例,我需要了解在方法参数中使用覆盖方法的新实例的概念。

我明白这段代码的作用,但我需要理解这个概念*

这叫匿名内幕Class

没有名字的class在java中被称为匿名内部class。如果必须覆盖 class 或接口的方法,则应使用它。

看看 File.list(FilenameFilter filter)documentation

它接受一个 FilenameFilter 作为参数,该参数又具有方法

boolean accept(File dir, String name)

您想将新的 FilenameFilter 传递给该方法,您可以通过将其作为 anonymous class 传递并覆盖匿名 class 中的 accept 方法来实现].

假设您有一个以接口或抽象 class 作为参数的方法。如果调用此方法,则必须传递指定类型的具体实例。一种可能性是,在参数内部创建一个实例。这叫做匿名class.

只有当你需要这个 class 一次时才应该这样做。

如果您检查 java.io.File 中 list() 的实际实现,它看起来像这样。

    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()]);
}

该方法需要任何实现 FilenameFilter 的实例。它在 File.list() 方法内部所做的是调用过滤器参数的 accept() 。并且实际上执行了调用者的原始实现。所以这意味着您在这种情况下提供的重写方法内容。