定义在一个类的内部范围的类称为内部类(inner class)。Java内部类包括成员内部类、静态内部类、局部内部类和匿名内部类等四种内部类。本书只讲解匿名内部类,它是开发中用得最多的内部类。
所谓匿名内部类(anonymous inner class),就是一个没有名字的内部类,多用于关注实现而不关注实现类的名字。匿名内部类的语法格式如下:
匿名内部类的语法格式同时完成了内部类的定义和该类实例对象的创建。匿名是指该内部类实质是一个子类,继承了父类或者实现了父接口,但却没有为其定义类名。当然,匿名内部类在编译时系统会自动命名为“外部类名$数字.class”,其中数字从1开始,外部类有几个匿名内部类就编号到几。
不管是接口、抽象类,还是具体类派生出来的匿名内部类,其用法都是一样的。匿名内部类通常并不需要增加额外的方法,只是对继承的方法进行实现或者重写。匿名内部类和单独写一个有名字的子类,然后创建其对象,再调用其方法的本质是一样的。匿名内部类使用范围非常有限,大多情况下用于接口回调,初学者不要求完全掌握,但要熟悉这种写法。
【例4-15】
举例演示匿名内部类的用法。
下面用一个实现接口的匿名内部类来演示其用法。
在项目chapter4下cn.linaw.chapter4.demo04包中定义一个My Task接口,如图4-35所示。
(www.xing528.com)
图4-35 定义MyTask接口
接着定义一个测试类My Task Test,演示匿名内部类的几种用法,如图4-36所示。
图4-36 匿名内部类的用法
以程序第5~10的代码为例说明匿名内部类的书写方法:首先写“new My Task(){};”,相当于创建了一个实现My Task接口的匿名子类,并创建一个实例;然后在{}中实现父接口My Task的所有抽象方法,声明变量,定义其他方法等;最后再调用方法“.current Task()”。
编译器在编译时,将匿名内部类单独编译成多个不同的.class类文件,如图4-37所示。
图4-37 编译时为匿名内部类自动命名
最后,留个作业:请自定义一个实现My Task接口的类,用于替换测试类My Task Test中出现的匿名内部类。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。