匿名内部类和接口类

一些接口“实例化”的情况

众所周知,在java中接口是不可实例化的,但是我们经常会遇到这样一些情况:

Runnable runnable = new Runnable() {
    @Override
    public void run() {

    }
};
File dir = new File("d://aa.txt");
File[] files= dir.listFiles(new FileFilter() {
    @Override
    public boolean accept(File pathname) {
        return  false;
    }
});

上面的Runnable和FileFilter都是接口,那怎么他们可以被new呢?难到接口也可以实例化吗?

答案当然是不能,接口就是接口,是不能被实例化的。

上面的情况事实上并不是被所谓实例化了,而是一种实现了该接口的匿名内部类

什么是匿名内部类?

  • 定义:匿名内部类是定义在类的局部位置,没有名称的内部类。
  • 一些特征:
    • 本质上:一个继承了父类的子类或者实现了某个接口的实现类
    • 本质上是一个类但同时也是一个对象
    • 没有类名
    • 匿名内部类无需写构造器
    • 可以访问外部类的属性(包括私有的)
    • 是一个局部变量,不能添加访问修饰符
  • 作用:当一个内部内只需要创建一次对象,以后再也不会用到。匿名内部类方便我们编写程序
//匿名内部类实例
public class  Student  {
    public void in(){
        //这是一个匿名对象
        new App().a();
        //匿名内部类
        new App(){
            @Override
            public void a() {
              
            }
        }  
  }
}
class App{
    public void a(){}
}

为什么出现这种情况

在了解了匿名内部类的定义之后,这种情况的答案就显而易见了,

Runnable runnable = new Runnable() {
    @Override
    public void run() {

    }
};

在这种情况中,右边其实是一个实现了Runnable接口的内部类并不是该类的实例化对象,左边则是一个Runnable接口的变量空间

和下面情况类似:

public class aa implements  Runnable {

    @Override
    public void run() {
        
    }

    public static void main(String[] args) {
        Runnable runnable = new aa();
        aa.run();
    }
}
posted @ 2023-05-23 15:34  云归处、  阅读(58)  评论(0)    收藏  举报