1.它本质上还是一个类
2.它还是一个内部类(如同内部类一样,他是定义在外部类的局部当中,方法或者代码块中)
3.它是匿名的 无名字的
4.同时它还是一个对象
——该图片来源自,韩顺平老师的java课
一.基于接口的匿名内部类
当我们要使用一个类的时候,要创建对象,但是当我们只是用一次的时候,这时候我们就要使用匿名内部类来简化开发
常规情况下我们调用一个基于接口的类的时候
public class AnonymousInter {
public static void main(String[] args) {
IA tiger = new Tiger();
tiger.cry();
}
}
interface IA{
void cry();
}
class Outer01{
private int n1 = 10;
public void method(){
}
}
class Tiger implements IA{
@Override
public void cry() {
System.out.println("tiger is cry");
}
}
class Father{
public Father() {
}
public void test(){
}
}
但是当我们用类匿名内部类的方法的时候
对比之前的调取用可以发现,在本次使用cry这个方法中我们并没用创建一个tiger类
而是直接使用了一个匿名内部类
并且对于我们所调用的这个对象tiger他的编译类型 可以看等号左边 毫无疑问就是IA这个接口,
但是它的运行类型 等号右边的那个 IA()是什么什么类型呐???
这就是我们tiger.getClass()的运行结果
可以很明显的看到他的运行类型是,它的外部类的名字后面加了一个 $1 的符号
他就是我们所说的匿名内部类
--------------------------------------------------------------------------------------------------------------------------------
并且这个匿名内部类他是系统在底层自动给分配的一个类,不能直接调用
上图中的xxxx(Outer$1)则是系统底层自动创建的匿名内部 然后将匿名内部类的地址返回给之前创建tiger对象(匿名对象只能使用一次,是一次性的,不能重复使用),但是tiger这个对象可以反复调用
二.基于类的匿名内部类
类似于基于接口的匿名内部类的创建
当然也是在jdk 底层创建的一个匿名内部类,同样是一次性使用,但是创建的对象father可以一直使用
3.基于抽象类的匿名内部类(abstract)
三.一些细节
诸多细节与局部内部类相似
四。匿名内部类的实际应用
1.可以将匿名内部类当作参数进行传递
这样的方法省去了再单独创建一个类\接口的时间,并且灵活性得到提升