黑马程序员技术交流社区

标题: 一个关于接口的问题 [打印本页]

作者: 赵晓东    时间: 2013-3-19 13:52
标题: 一个关于接口的问题
本帖最后由 赵晓东 于 2013-3-19 20:24 编辑
  1. /*File_List*/

  2. import java.io.*;

  3. class  ListDemo
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                 list2();
  8.         }
  9.         public static void list1()
  10.         {
  11.                 File fi = new File("E:\\");
  12.                 String[] fil = fi.list();
  13.                         
  14.                 for (String file: fil)
  15.                 {
  16.                         System.out.println(file);
  17.                 }
  18.         }
  19.         public static void list2()
  20.         {
  21.                 File f = new File("E:\\javase");

  22.                 File[] fi = f.listFiles(new FilenameFilter() //疑问在这里,为什么这个接口创建了对象
  23.                 {
  24.                         public boolean accept(File dir,String name)
  25.                         {        
  26.                                 return name.endsWith(".java");
  27.                         }
  28.                 });
  29.                 for (File fil : fi)
  30.                 {
  31.                         System.out.println("name: "+fil.getName()+" size : "+fil.length()+"字节");
  32.                 }
  33.         }
  34. }
  35. /*
  36. public interface FilenameFilter

  37. 这是个接口,为什么new了一个对象?
  38. 匿名内部类 如果实现接口,不用写implements吗?
  39. */
复制代码

作者: 张亚青    时间: 2013-3-19 14:13
本帖最后由 张亚青 于 2013-3-19 14:14 编辑

【匿名内部类】
匿名内部类
1、匿名内部类其实就是内部类的简写格式。
2、定义匿名内部类的前提:
        内部类必须是继承一个类或者实现接口。
3、匿名内部类的格式:new 父类或者接口(){定义子类的内容}
4、其实匿名内部类就是一个匿名子类对象。
5、匿名内部类中定义的方法最好不要超过3个。


匿名内部类就是为了简化书写,覆盖方法。
匿名内部类不能进行强转(向上转型)。


【答案】在本题中参照第3点可以看出,这是规定好的创建匿名内部类的格式。
作者: 郝强勇    时间: 2013-3-19 14:35
File[] fi = f.listFiles(new FilenameFilter() //疑问在这里,为什么这个接口创建了对象?

                {

                        public boolean accept(File dir,String name)

                        {        

                                return name.endsWith(".java");

                        }

                });

这是个匿名内部类,并不是接口创建的对象,接口是不能创建对象的,表面上看是接口创建的对象,但后面的那对儿代码块{}实质是创建了一个匿名的类去实现了接口,并创建了实例对象,这个过程是一气呵成的,中间省略了一些细节,所以代码简单,不需要用到implements关键字。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2