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小时的原地踏步,加油!