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

posted @ 2023-06-21 17:19  离人怎挽_wdj  阅读(35)  评论(0编辑  收藏  举报