匿名内部类的介绍
- 匿名内部类是一个非常特殊的内部类,从命名可以看出,匿名内部类是没有类名,一般来说这个内部类只能用一次。
- 有什么场景可以使用呢?匿名内部类一般用于简化代码,当要快速实现一个抽象类或者接口的抽象方法时,我们就可以使用匿名内部类来简化,可以不用专门定义一个有名类来操作。
- 有上述可知,要使用匿名内部类,必须要有一个父类或者父接口。
匿名内部类的定义格式
- new 类名/接口名() { }
特点分析
- 该匿名内部类大括号就是某一个类的子类或者接口的实现类
- 该格式体现的不仅是一个类,同时还是一个对象
匿名内部类的使用
- 使用父类型变量多态接受该匿名子类对象
- 以匿名对象的方式使用
- 直接调用方法使用
- 当做方法的参数传递
- 当做方法的返回值使用
public class Test2 {
public static void main(String[] args) {
/*1 使用父类型变量多态接受该匿名子类对象*/
Flyable f1 = new Flyable() {
@Override
public void fly() {
System.out.println("不知道什么在飞111");
}
};
f1.fly(); // 不知道什么在飞111
/*2 直接调用方法使用*/
new Flyable() {
@Override
public void fly() {
System.out.println("不知道什么在飞222");
}
}.fly(); // 不知道什么在飞222
/*3 当做方法的参数传递*/
showFlyable(new Flyable() {
@Override
public void fly() {
System.out.println("不知道什么在飞333");
}
});
/*4 当做方法的返回值使用*/
Flyable f2 = getFlyable();
f2.fly(); // 不知道什么在飞444
}
public static void showFlyable(Flyable flyable) {
flyable.fly();
}
public static Flyable getFlyable() {
return new Flyable() {
@Override
public void fly() {
System.out.println("不知道什么在飞444");
}
};
}
}
// 接口
interface Flyable {
public abstract void fly();
}
匿名内部类的前提条件
- 有一个父类(可以是抽象类也可以是非抽象类, 匿名内部类相当于是其子类)或者父接口(匿名内部类相当于是其实现类)
- 如果匿名内部类是基于抽象类或接口的, 那么它需要实现抽象类或接口的所有抽象方法