匿名内部类:是内部类的简写。它的本质其实是一个带着具体实现父类或者父接口的匿名的子类对象
前提:
匿名内部类必须【继承一个父类】或者【实现一个接口】,伴随着重写父类或者父接口当中的抽象方法。
以往的操作:想要使用接口当中的方法。需要四部操作
1、定义 接口的实现类
2、重写接口当中的抽象方法
3、构建子类对象,把子类赋值给父接口变量
4、通过父接口变量调用接口当做方法
匿名内部类的定义格式:
new 父类名或者父接口名 {
// 方法的重写
@Override
public void method(){
// 重写的方法体内容。。。
}
};
//例子
public interface Usb(){
void open();//打开设备功能
void colse();//关闭设备功能
}
public static void main(String[] args){
new Usb() {
@Override
public void open() {
System.out.println("设备功能开启。。");
}
@Override
public void close() {
System.out.println("设备功能关闭。。");
}
};
}
如果接口当中的实现类(或者父类的子类)在程序当中只需要使用唯一的一次,这种情况下可以使用匿名内部类。
对格式:new 借口名称(){}分析
1、new 代表创建对象
2、借口名称就是匿名内部类需要实现的那个接口,同时需要哪个接口实现类的对象
3、{}这是匿名内部类的内容
使用匿名内部类注意事项:
1、匿名内部类在创建对象时,只能使用唯一的一次
如果希望多次创建对象,而且类的内容是一样的话,建议单独定义实现类
2、匿名对象,在【调用方法时】,也只能使用唯一一次
如果希望同一个对象,调用多次方法,那么就建议给对象起个名字
3、匿名内部类是省略了【实现类/子类名称】,但是匿名对象是省略了【对象名】
备注:匿名内部类和匿名对象两者根本就不是一回事!!
通常在方法的形式参数是接口或者抽象类时,一般将匿名内部类作为实参进行参数传递。
例子如下:
public interface Animal {
// 吃
public abstract void eat();
}
// 定义一个启动类
public class DemoAnonymous {
// 定义成员方法
public static void showEat(Animal animal){
animal.eat();
}
public static void main(String[] args) {
// 采用匿名内部类的方式来写
// 多态写法
// 等号左边:接口
// 等号右边:本质是Animal接口的子类对象
Animal animal = new Animal() {
@Override
public void eat(){
System.out.println("猫吃鱼");
}
};
showEat(animal); // 猫吃鱼
// 简化一下
showEat(new Animal(){
@Override
public void eat(){
System.out.println("猫吃鱼");
}
});
}
}