匿名内部类和接口类

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。匿名内部类和接口类,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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

众所周知,在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();
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/195260.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!