一些接口“实例化”的情况
众所周知,在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