java#三分钟彻底搞定匿名内部类

1.原始代码

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Button clicked!");
    }
});

这里提一个问题,new ActionListener后面的()是什么意思?别着急,看完下面的反编译字节码文件你就恍然大悟。
2.将原始代码的字节码文件反编译后的代码

private final class $1 extends java.awt.event.ActionListener {
    private $1();
    public void actionPerformed(java.awt.event.ActionEvent);
}

  • $1: 这是编译器生成的名称,用于表示第一个匿名内部类。编译器为每个匿名内部类生成一个独特的名称。这个名称在源码中不可见,但在编译后的字节码中可见。
  • (): 这是构造函数的参数列表。因为匿名内部类通常没有参数,所以构造函数没有任何参数。
  • private $1(); 表示匿名内部类 ActionListener 实现的构造函数,它是私有的,仅用于初始化这个匿名类的实例。
  • public void actionPerformed(java.awt.event.ActionEvent); 表示实现 ActionListener 接口的 actionPerformed 方法,它处理点击事件。

3.为了更直观的观察匿名内部类,我们直接把它单独拿出来分析

 new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Button clicked!");
    }

3.1首先,去掉new ActionListener()

得到了如下:

{
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Button clicked!");
    }

这一坨就代表一个没有名字的类

3.2然后,看去掉的new ActionListener()

那new关键字到底是不是和ActionListener一起的?红色()代表了什么?

实际上new是和后面的没有名字的类{
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Button clicked!");
    }

一起的

红色()代表这个没有名字的类的构造方法,这一点你要对比反编译后的代码看

4.为了更容易让大家理解我把原始代码这样书写:

ActionListener a = new {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Button clicked!");
    }()

这个格式就相当于用接口的实现类去new出来一个对象再赋值给此接口类型的变量,这不就是“多态”吗?

相信大家看到这里已经彻彻底底,明明白白的理解了匿名内部类

5.最后,学习了匿名内部类我们能干什么?

使用场景:当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象,button.addActionListener(new ActionListener() {...}

这里addActionListener(接口的实现类对象)里面就是。

所以,如果实现类只要实现一次,就用匿名内部类,可以简化代码

好了,今天的学习就到这了,如果这里的内容对你有帮助,那就说明你又又又进步了!学习应该有针对性,只要有进步那就胜过24小时的原地踏步,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值