一篇文章理解Java的匿名内部类语法

什么是匿名内部类?

将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,类B则称为外部类
匿名内部类 是内部类的简化写法。它的本质是一个带具体实现的 父类或者父接口的 匿名的 子类对象

如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况下就可以省略该类的定义,而改为使用 匿名内部类。

特征:声明匿名内部类的同时创建该类的对象

前提

存在一个或者接口,这里的类可以是抽象类也可以是普通类

语法格式:

继承父类:

new 父类名称([实参列表]){
    // 类的成员列表
};

说明:如果子类调用的是父类的无参构造,那么()中实参列表不用写,如果子类调用的是父类的有参构造,那么就在()中传入实际参数

实现接口:

new 接口名称(){
    // 类的成员列表
};

接口不是不能实例化吗,new关键字的后面为什么跟着接口名?

对格式“new 接口名称() {…}”进行解析:

  1. new代表创建对象的动作
  2. 接口名称表示匿名内部类需要实现哪个接口
  3. {…}是匿名内部类的内容

使用方式

以接口为例,当你使用一个接口时,似乎得做如下几步操作:

  1. 定义接口实现类
  2. 重写接口中的方法
  3. 创建子类对象
  4. 调用重写后的方法

我们的目的最终只是为了调用方法,那么能不能简化一下呢?

案例需求:

定义笔记本电脑类,电脑有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盘传输数据…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值