为什么当我们编写事件处理时,我们写
私有类 A 扩展 MouseAdapter 实现 ActionListener
为什么使用鼠标适配器扩展并使用ActionListener实现,如果它成为扩展是否重要 ActionListener 实现鼠标适配器
你不能写
extends ActionListener implements MouseAdapter
因为ActionListener
是一个接口,而MouseAdapter
不是。一个更好的问题是为什么作者没有写
implements MouseListener, ActionListener
可能的答案是:
MouseAdapter
是接口MouseListener
的空实现,它定义了多个事件方法。现在,如果您只想在事件方法上实现,例如 mouseClicked
,则实现MouseListener
强制您为所有其他鼠标方法添加空实现。从 MouseAdapter
派生允许您仅重写特定方法,从而使侦听器类更小。
现在有了Java 8定义默认方法的能力,像MouseListener
这样的接口实际上应该有空的默认实现,这使得MouseAdapter
多余。
ActionListener 只有一个方法。MouseListener 有很多方法。因此,您可以实现 MouseListener,但随后您需要实现其所有方法,即使您只想处理单个事件类型(例如 mouseClicked)。
MouseAdapter 是一个实现 MouseListener 的类,并通过执行操作来实现其所有方法。无。因此,扩展 MouseAdapter 很方便:它只允许覆盖感兴趣的方法。创建 ActionAdapter 是没有意义的,因为它将包含一个方法,您始终必须重写该方法才能执行一些有用的操作。
但请注意,让单个类同时处理鼠标事件和操作事件是一种设计气味。侦听器应该专注于单个任务:处理来自给定源的给定事件。
之间的区别在于,MouseAdapter 是一个抽象类,ActionListener 是一个接口。在Java中实现接口,并扩展抽象类。
抽象类和接口可以履行类似的角色,但有一些关键区别,我建议您查看两者的文档以了解更多信息。
鼠标适配器https://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseAdapter.html动作侦听器 https://docs.oracle.com/javase/7/docs/api/java/awt/event/ActionListener.html