一 前言
本文会由浅入深,把匿名内部类的由来,定义,用法,以及在java5,和java8中一些新的语法,对其形式上的变形,阐述的清清楚楚。对于完全没有接触过匿名内部类的朋友,或者对其一知半解的朋友,相信读完此文,会豁然开朗。
二 相关概念
对于匿名内部类,首先应该明白一些相关基本概念。顾名思义,他是一个类,并且是内部的类,还是一个匿名的类。
2.1内部类
2.1.1什么是内部类
- 当一个类的定义中出现另外一个类的类体中时,那么这个类就叫内部类(inner),而这个内部类所在的类就叫外部类(outer)。比如类A中又存在另外一个类B,那么我们就可以把类B叫做类A的内部类。
- 所以类的内容就会比我们常见的成员变量,成员方法,构造方法等等 多了一个新的东西叫内部类。
**定义:**当一个类的存在只是单单为另外某一个类服务时,那么就可以把这个类定义为 为其服务的类中的一部分—内部类。
2.1.2 内部类的作用
对于常规的类,内部类可以隐藏该类的实现细节并且可以方便访问外部类的私有成员,而不需要再提供公有的get 和set方法。
2.1.3 内部类的分类
所谓其分类,只是把内部类放在相对外部类的位置在哪儿,其放的位置不同,名字就会不同,对应的功能也会不同,最常见的还是匿名内部类。
- 普通内部类:直接讲一个类的定义放在另外一个类的类体中
- 静态内部类:使用static关键字修饰的内部类,隶属于类层级
- 局部内部类:直接讲一个类的定义放在方法体的内部
- 匿名内部类:指这个内部类没有名字。
总结 :
通俗的讲:比如类A中又存在另外一个类B,那么我们就可以把类B叫做类A的内部类。匿名内部类是内部类的一种,但是这个类没有类名,是匿名的。我们这样做的用法是,作用是忽略其这个内部类的实现细节,并且是一次性的。对于以上概念性的阐述,
2.2 回调模式
定义: 如果一个方法的参数是接口类型,则在调用此方法时,需要传递一个实现此接口类型的对象;同时该方法在运行时,会调用传递参数对象的方法(对象在接口中定义)
举个栗子:
- 定义一个接口
public interface AnonymousInterface {
// 自定义抽象方法
public abstract void show();
}
- 定义含有成员方法为形参为接口类型的类
public class AnonymousInterfaceTest {
// 假设已有下面的方法,请问如何调用下面的方法?
public static void test(AnonymousInterface ai) {
ai.show();
}
public static void main(String[] args) {
// Error:接口不能实例化
//AnonymousInterfaceTest.test(new AnonymousInterface());
}
我想给test()方法传参,但是形参是一个接口,不能通过new AnonymousInterface()
对其进行传参。如果要对其传参,那么必须new 一个实现这个接口的类,将new出来的对象传入该方法。
3. 实现AnonymousInterface
接口的类
// 实现上面接口的类
public class AnonymousInterfaceImpl implements AnonymousInterface {
@Override
public void show