Java匿名内部类
class Outer {
public void f(){
IA ia = new IA(){
@Override
public void say() {
System.out.println("hi~");
}
};
ia.say();
System.out.println(ia.getClass().getName());
}
}
interface IA {
void say();
}
public class test {
public static void main(String[] args) {
new Outer().f();
}
}
关于这段代码肯定有很多疑问,我来一一解释一下。
先来看一个需求:我有一个接口,现在我想要实现接口里面的方法,并且在Outer类的f()方法里去使用这个方法。
常规的方法就是写一个新的类,让这个类去实现这个接口,然后再new一个对象,通过对象去调用这个方法。可是如果我这个方法只用一次的话,这样去做就显的代码有一些啰嗦,如果再来一个接口就又要写一个新的类......,这样想想都烦。所以我们就可以使用匿名内部类去解决这个问题。
所以上面这段代码就可以这样理解:
IA ia = new IA(){}
这里肯定有很多疑问,为什么可以实例化一个接口?其实这里不是实例化一个接口,这里在底层就相当于系统去创建了一个实现了IA接口的类(也就是匿名内部类),然后立马去创建了这个类的对象,接着返回给ia,让ia去指向这个对象,最后要注意,底层在创建了一个对象之后,这个类就没有了(不是说ia没有了,只是匿名内部类没有了,但是返回的对象还是存在的)。
这就是匿名内部类的一个大体过程,那我为什么说匿名内部类其实是有名字的呢,其实只要调一下ia的getclass方法就可以很清楚的看到底层创建的匿名内部类的名字了.
原文链接:https://blog.csdn.net/qq_58453382/article/details/122051661
I can feel you forgetting me。。 有一种默契叫做我不理你,你就不理我