对于这段程序,accept的确没有作用,其实当在main中对DirFilte构造之后,就没有再用之
accept必需显式地调用才可以起到作用

解决方案 »

  1.   

    accept就是用来让你重载的,在list的时候由list自动调用类似的还有一些CellRender,CellEditor
      

  2.   

    这是Thinking in Java中的一个例子。
    在每次给list加一个element时,都会自动的调用accept函数。
    具体的可以看Thinking in Java(2nd),里面解释的很清楚。
      

  3.   

    list自动调用,无需自己显式调用
      

  4.   

    应该不是自动调用的,如果是那样的话,应该是和类名一样的函数,或者是系统内定的函数(比如,线程内的函数run就是自动调用的)
      

  5.   

    jszj(一麦偶) 错~
    应该是自动调用,因为DirFilter实现了FilenameFilter接口,
    而File类的list()方法调用了FilenameFilter的accept()方法。
    有JSDK源码为证:
    public String[] list(FilenameFilter filter) {
    String names[] = list();
    if ((names == null) || (filter == null)) {
        return names;
    }
    ArrayList v = new ArrayList();
    for (int i = 0 ; i < names.length ; i++) {
        if (filter.accept(this, names[i])) {
    v.add(names[i]);
        }
    }
    return (String[])(v.toArray(new String[0]));
        }
      

  6.   

    public static void main(String args[])
    {
      File flDir = new File(".");
      System.out.println("Files in "+flDir.getAbsolutePath());
    String strFiles[];
    if(args[1].equals("*"))
     strFiles[]=flDir.list(new Filter(args[1]));
    else  strFiles[] = flDir.list();
    int intDirCount = 0, intFileCount = 0;
    long lngSize = 0;
    String dir = "dir", delTree = "delTree";
      

  7.   

    那或许可以这样理解吧:
    如果开始那段程序是你自己写的,那么应该是不会自动调用的,但是,如果它是你从jdk的源代码中摘出来的,那那根据上边的这段代码,应该是自动调用的。
    为什么呢?
    1.如果是你自己写的,因为你没有调用那个函数,而且又不是构造函数,所以必需显式地调用
    2.如果是摘出来的,那么,这个调用是jdk的内部显式地调用了(从上边的代码可以看出),但做为我们使用的时候,由于没有涉及到内部的东西,因而对我们而言,就是自动调用了。这可以这样想,对于一辆汽车,从外部情况来说,没有动力去推动它,但是从汽车的内部来说,却有一个发动机在推它。(这个例子虽然不太好,但我想,还是能说明一点问题)