一些接口“实例化”的情况
众所周知,在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();
}
}
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();
}
}
标签:Runnable,内部,void,接口,匿名,new,接口类,public
From: https://www.cnblogs.com/rainaftersummert/p/17425396.html