内部类之匿名内部类(内部类合集,第三篇,原理+细节+实现)

前两篇:

面向对象高级部分---内部类,什么是内部类,内部类的划分,为什么要用内部类?-CSDN博客

内部类之局部内部类(内部类合集,第二篇,原理+细节)-CSDN博客

接上篇我们介绍过局部内部类,匿名内部类和局部内部类在外部类的位置都是一样的,定义在外部类的局部变量位置(方法体或代码块中),因此在某些细节和局部内部类是一样的,譬如,就近访问原则,不能添加修饰访问符,同时匿名内部类的细节和重要性要更强一点,建议读者先看上篇文章再来看本片文章,相信我,看完这篇文章你会对匿名内部类有更深层次的认识,并且在看底层源码时不会再被卡壳。在最后有一个关于匿名内部类的总结,非常重要,可以让你站在上帝视角!大家一定要看!

首先,我直接摆出结论,匿名内部类的三个重要特性(不理解没关系,后面会仔细论述):

  1. 匿名内部类和局部内部类的本质一样,都是类!
  2. 匿名内部类是匿名不是没有类名,只是名字不由程序员定义而是由Java底层来定义
  3. 匿名内部类同时是一个对象!!

还有一个所有内部类都共有的特性,在上篇文章已经提过了,就是可以直接访问外部类的所有成员和方法,公有私有都可以。

匿名内部类的基本语法

new 类或接口(参数列表){
    类体
};

对于第一个结论:这点看过我前面的文章应该很清楚,不管是匿名内部类或者局部内部类本质都是类,只是Java语法对它的位置做了规定,但本质都是类,因此具备类的五大成员及继承,多态等特点,同时,再次提醒,匿名内部类的位置也是在局部变量,因此不可以添加访问修饰符。

第二个结论:匿名内部类是有具体名词和类结构的,只是是在Java编译之后,由Java底层帮助我们实现。我贴上一个例子大家看一下。我将匿名内部类进行转化后的形式也贴了出来,给大家看看。

class Father {//演示类

    public Father(String name) {//构造器
        System.out.println("接收到 name=" + name);
    }

    public void test() {//方法
    }
}

//Java底层会创建匿名内部类
//这部分不再代码中,我特地将匿名内部类转化出来给大家看,
//当我们运行程序后,Java底层就会把我们的匿名内部类编译成为这种形式
/*
class Outer04$2 extends Father{
    @Override
    public void test() {
        System.out.println("匿名内部类重写了 test 方法");
    }
}


*/
Father father = new Father("jack"){//("jack") 参数列表会传递给Father类的构造器
    @Override
    public void test() {
        System.out.println("匿名内部类重写了 test 方法");
    }
};

第三个结论:在之前多态的文章中,我曾经提到过编译类型和运行类型(编译类型指等号左边的对象类型,运行类型指等号右边的对象类型),在匿名内部类的实现中,编译类型是谁?Father类,运行类型呢?

在这里不是Father类,是outer04$2(这个类名是匿名内部类真正的类名,是由Java底部去起的名字,规律就是 外部类+数字+$+数字)。为什么要提一下编译类型和运行类型呢?目的就是要知道,当我们使用匿名内部类时,在Java的堆区中并没有Father类的对象,而是存在一个由Java底层帮助实现类名为 outer04$2的 对象,对象的类体是我们匿名内部类中实现的类体,Java底层在编译匿名内部类后,将这个对象实例创建出来并返回给我们的父类引用(多态,不是很清楚的可以去看看之前的文章,Java中的多态(二)---动态绑定(父类引用指向子类对象)-CSDN博客)

总结一下,其实对于匿名内部类,大家一定要有一个简单通俗的认识---匿名内部类就是通过在方法中去实现接口或重写父类的方法来达到一个程序的需求,不需要去专门写一个实现类或继承类,保证再其他类文件中不再使用该实现类,这就是匿名内部类的终极意义,同时大家也可以思考一下为什么Java底层和框架中大量使用匿名内部类?其实原因很简单,一方面,内部类可以简化代码的占比,简化代码,另一方面,在实际开发中,项目负责人开会总结出对应的功能,写好接口,底下的员工就可以去实现这些接口,为了防止接口类,实现类过多,并且方便定位,对于这些重复使用率不高的类,都会通过内部类来实现。

到这里,内部类的最重要也是将来用的最多的部分就阐述完了,觉得还不错的可以点个赞和关注,感谢各位读者!

你可能感兴趣的:(Java语言类,java,开发语言)