2017-03-02 37 views
2

任何一个可以帮我了解java类实例

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

的这个代码块这仅仅是例子,我需要了解新的实例与方法的参数内覆盖方法的概念。

我明白这是什么代码做的,但我需要了解*

+0

它创建一个[匿名类](https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html),实现'FilenameFilter'界面 – UnholySheep

+0

我认为你应该阅读[匿名类Java文档](https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html) –

+0

https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html –

回答

-2

这就是所谓的匿名内部类

没有名称被称为Java中的匿名内部类的类的概念。如果必须覆盖类或接口的方法,应该使用它。

+0

这只是匿名课程。不是内心阶层。内部类和匿名类是不同的。当然,你可以有一个同时在一起的课程,但据我们所知,情况并非如此。 –

0

看一下File.list(FilenameFilter filter)documentation

它需要一个FilenameFilter作为参数,这反过来方法

boolean accept(File dir, String name)

你想传递一个新的FilenameFilter的方法和你做,通过把它当作一个anonymous class和重写accept方法在匿名类中。

0

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

只有当你只需要这个类时,你应该这样做。

0

如果您在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()方法中的作用是调用filter参数的accept()。哪个实际执行调用者的原始实现。这意味着您在这种情况下提供的重写方法内容。