【问题标题】:class instance with override inside method parameter具有覆盖内部方法参数的类实例
【发布时间】:2017-03-02 08:04:25
【问题描述】:

谁能帮我理解这个java代码块

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

这只是一个例子,我需要了解新实例的概念,方法参数中包含覆盖方法。

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

【问题讨论】:

标签: java class anonymous-inner-class


【解决方案1】:

看看File.list(FilenameFilter filter)documentation

它以FilenameFilter 作为参数,而参数又具有方法

boolean accept(File dir, String name)

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      如果您在 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()。它实际上执行了调用者的原始实现。这意味着您在这种情况下提供的覆盖方法内容。

      【讨论】:

        【解决方案4】:

        这叫做匿名内部类

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

        【讨论】:

        • 只是匿名类。不是内部阶级。内部类和匿名类是不同的。当然,您可以同时开设一个课程,但据我们所知,这里并非如此。
        猜你喜欢
        • 2021-07-14
        • 2020-07-21
        • 1970-01-01
        • 2015-02-18
        • 2021-11-28
        • 2022-08-05
        • 2014-08-11
        • 2012-07-19
        • 1970-01-01
        相关资源
        最近更新 更多