什么是匿名内部类?
将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,类B则称为外部类。
匿名内部类 是内部类的简化写法。它的本质是一个带具体实现的
父类或者父接口的
匿名的
子类对象
如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况下就可以省略该类的定义,而改为使用 匿名内部类。
特征:声明匿名内部类的同时创建该类的对象
前提
存在一个类或者接口,这里的类可以是抽象类也可以是普通类。
语法格式:
继承父类:
new 父类名称([实参列表]){
// 类的成员列表
};
说明:如果子类调用的是父类的无参构造,那么()中实参列表不用写,如果子类调用的是父类的有参构造,那么就在()中传入实际参数
实现接口:
new 接口名称(){
// 类的成员列表
};
接口不是不能实例化吗,new关键字的后面为什么跟着接口名?
对格式“new 接口名称() {…}”进行解析:
- new代表创建对象的动作
- 接口名称表示匿名内部类需要实现哪个接口
- {…}是匿名内部类的内容
使用方式
以接口为例,当你使用一个接口时,似乎得做如下几步操作:
- 定义接口实现类
- 重写接口中的方法
- 创建子类对象
- 调用重写后的方法
我们的目的最终只是为了调用方法,那么能不能简化一下呢?
案例需求:
定义笔记本电脑类,电脑有USB接口,通过插入鼠标、键盘等不同设备,实现各自不同功能。
传统方式:
定义接口:
public interface USB {
public void use();
}
定义笔记本类,定义鼠标类、键盘类分别实现USB接口:
class Mouse implements USB {
@Override
public void use() {
System.out.println("点击鼠标操控电脑...");
}
}
class KeyBoard implements USB {
@Override
public void use() {
System.out.println("键盘输入数据...");
}
}
public class NoteBook {
// 要求传递的对象要实现USB接口
public void plugIn(USB usb) {
usb.use();
}
}
测试类:
public class AnonymousClassTest {
public static void main(String[] args) {
NoteBook noteBook = new NoteBook();
USB mouse = new Mouse();
noteBook.plugIn(mouse);
USB keyBoard = new KeyBoard();
noteBook.plugIn(keyBoard);
}
}
匿名内部类方式:
定义接口:
public interface USB {
public void use();
}
定义笔记本电脑类,无需定义鼠标类、键盘类:
public class NoteBook {
// 要求传递的对象要实现USB接口
public void plugIn(USB usb) {
usb.use();
}
}
测试类:
public class AnonymousClassTest {
public static void main(String[] args) {
NoteBook noteBook = new NoteBook();
// 下面这段代码,声明了实现USB接口的匿名内部类,也创建了它的对象
// 但是这个对象既没有赋值给一个变量,也没有直接调用方法,无法直接使用
new USB() {
@Override
public void use() {
System.out.println("实现了USB接口");
}
};
// 使用方式一:
// 把创建的对象赋值给一个变量,然后调用重写的use方法
// 多态引用
USB mouse = new USB() {
@Override
public void use() {
System.out.println("点击鼠标操控电脑...");
}
};
mouse.use();
// 使用方式二:
// 用创建的对象直接调用重写的use方法
new USB() {
@Override
public void use() {
System.out.println("键盘输入数据...");
}
}.use();
// 使用方式三:
// 把创建的对象作为方法实参
noteBook.plugIn(new USB() {
@Override
public void use() {
System.out.println("U盘传输数据...");
}
});
}
}
测试结果:
点击鼠标操控电脑…
键盘输入数据…
U盘传输数据…