JAVA 监听器与适配器 小小的分析

简介:

监听器和适配器是Java图形用户界面(GUI,Graphics User interface)设计的抽象窗口工具集(AWT,Abstract Window Toolkit)的两个重要概念,他们都在java.awt包中。JDK1.1引入了委托事件模型,监听器和适配器就是这一模型的具体实现,所以理解他们就变得非常重要,初学者可能对于这两个概念有点陌生,为了节省他们看长编大论再自己总结的时间,我在这里就把自己的理解写出来,抛砖引玉。

1.委托事件模型
         要理解监听器和适配器,那么一定要了解委托事件模型,它区别于层次事件模型(JDK1.1以前的Java标准),根据不同的用户操作,产生不同的事件(Event类),并为每个事件类定义了事件对象的接受和处理方法,这些方法都包括在我们的监听器(Listener Interfance)里面,我们注册相应的事件监听程序后,就可以接受事件对象,实现相应的方法。

2.监听器和适配器是什么?
         如果一个类里声明了抽象方法,那么它也必须声明为抽象的。换句话说,包含有抽象方法的类就是抽象类。
         如果一个类里面的方法都是抽象的,那么它就是一个接口,也就是说,接口是一种特殊的抽象类。(当然,抽象类跟接口是有区别的,本文并不深入讨论这个问题)
         事件的监听程序(Listener)是接口中的一个未实现的方法。
         很明显,监听器实质上就是一个接口(Interface)。
         适配器(Adapter)是跟监听器一一对应的类。它实现了对应监听器中的所有方法,但都是空方法。注意:适配器是一个抽象类(abstract class)

3.适配器和监听器的使用
        在实际使用中,适配器只是作为方便程序员编程的一个手段,一般情况下程序员都要重写适配器中某些需要的方法,以达到所要的功能,如果只是一个适配器,那么它什么也不干。
        当然你也完全可以不用适配器,自己把监听器里面的方法全写一遍,那么在功能上是没什么不同的。也就是说有两种完成的方式:
①需要注册监听程序的类实现接口(监听器),然后重写接口中的所有方法
②需要注册监听程序的类实现接口(监听器),然后继承适配器,再重写需要的方法

4.需要注意的地方
  Ⅰ 有些教材把事件监听程序(Listener)等同于监听器(Listener Interface),本人觉得它们应该是接口中的方法与接口的关系,另外也有人把监听器称为监听者。
         Ⅱ 监听器是接口,是需要实现(implements)的,适配器是抽象类,是需要继承(extends)的。而由于适配器已经实现了对应的监听器,故继承了适配器的类不用再声明实现对应的监听器,就可以注册对应的监听程序。
例如:public class Calc1 extends WindowAdapter implements ActionListener,ItemListener
             {
                 Frame f;
                 TextField tf1;
                 Checkbox cb1;
                  ……
                 public void display()
                  {
                     ……
                     tf1.addActionListener(this); //实现了ActionListener,故可以注册对应的ActionListener
                     cb1.addItemListener(this); //实现了ItemListener,故可以注册对应ItemListener
                     f.addWindowListener(this);    //继承了WindowAdapter,也可以注册对应的WindowListener
                     ……
                   }

                  ……
              }  

  Ⅲ 在实际使用中,由于Java只能单继承,对于接口和抽象类的选择就需慎重考虑,同样的一个类只能继承一个适配器,这也意味着其它的监听程序就需要手动实现,在优秀的编辑工具下这个工作量也许并不大,但也可以尝试把监听器交给别的类(比如类A)来实现,而类A就可以继承对应的适配器,这才是Java的单继承多接口机制的思想所在。



目录
相关文章
|
25天前
|
存储 Java
【编程基础知识】 分析学生成绩:用Java二维数组存储与输出
本文介绍如何使用Java二维数组存储和处理多个学生的各科成绩,包括成绩的输入、存储及格式化输出,适合初学者实践Java基础知识。
57 1
|
2月前
|
缓存 JavaScript Java
常见java OOM异常分析排查思路分析
Java虚拟机(JVM)遇到内存不足时会抛出OutOfMemoryError(OOM)异常。常见OOM情况包括:1) **Java堆空间不足**:大量对象未被及时回收或内存泄漏;2) **线程栈空间不足**:递归过深或大量线程创建;3) **方法区溢出**:类信息过多,如CGLib代理类生成过多;4) **本机内存不足**:JNI调用消耗大量内存;5) **GC造成的内存不足**:频繁GC但效果不佳。解决方法包括调整JVM参数(如-Xmx、-Xss)、优化代码及使用高效垃圾回收器。
138 15
常见java OOM异常分析排查思路分析
|
3月前
|
Java 程序员
Java 一个 Scanner.nextInt 造成的奇怪问题及分析解决过程
Java 一个 Scanner.nextInt 造成的奇怪问题及分析解决过程
|
8天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
21 2
|
9天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
9 2
|
25天前
|
Java
让星星⭐月亮告诉你,Java synchronized(*.class) synchronized 方法 synchronized(this)分析
本文通过Java代码示例,介绍了`synchronized`关键字在类和实例方法上的使用。总结了三种情况:1) 类级别的锁,多个实例对象在同一时刻只能有一个获取锁;2) 实例方法级别的锁,多个实例对象可以同时执行;3) 同一实例对象的多个线程,同一时刻只能有一个线程执行同步方法。
15 1
|
25天前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
34 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
27天前
|
Java
如何从Java字节码角度分析问题|8月更文挑战
如何从Java字节码角度分析问题|8月更文挑战
|
30天前
|
分布式计算 Java Hadoop
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
61 1
|
1月前
|
安全 网络协议 Java
Java反序列化漏洞与URLDNS利用链分析
Java反序列化漏洞与URLDNS利用链分析
47 3