java中的预定义接口如何工作?

时间:2016-09-12 09:43:47

标签: java interface

这个问题不是关于如何使用接口,而是关于java中的一些预定义接口是如何工作的。

例如,考虑java.awt.event包中的ActionListener接口。当我们实现接口时,我们必须定义actionPerformed()方法,该方法将在action发生时被调用。

我想知道的是这是如何工作的。我们不会编写任何检查操作发生的代码,然后调用actionPerformed。界面中的代码也不是。它会自动发生。

谁在做这项工作?

2 个答案:

答案 0 :(得分:3)

ActionListener等接口是回调的实现。这意味着还有其他类,例如JButton,用于检查用户操作是否发生,以及何时发生。他们的任务是让你的代码知道它何时发生。

他们通过回调您传递给他们的actionPerformed接口的ActionListener方法来实现。这种方法在UI代码之间提供了非常清晰的分离,UI代码知道动作何时发生,但不知道您想要做什么,以及您的代码,它们确切知道该做什么,但不知道动作何时发生。

答案 1 :(得分:0)

不确定你的意思"预定义"因为Java提供的或您编写的没有区别。

例如,假设您使用的是MouseListener,并将其添加到某个Component,然后该界面将分配给该组件的MouseListener字段。

每当触发鼠标事件时,都会调用此方法(OpenJDK源)。请注意,这里调用interfaces方法。 (注意:此前还有其他工作可以检测到事件实际上是由鼠标引起的)。

但是,您可以想象,对于Button,actionPerformed方法会经历与鼠标单击事件相同的逻辑集。

protected void processMouseEvent(MouseEvent e) {
    MouseListener listener = mouseListener;
    if (listener != null) {
         int id = e.getID();
         switch(id) {
           case MouseEvent.MOUSE_PRESSED:
               listener.mousePressed(e);
               break;
           case MouseEvent.MOUSE_RELEASED:
               listener.mouseReleased(e);
               break;
           case MouseEvent.MOUSE_CLICKED:
               listener.mouseClicked(e);
               break;
           case MouseEvent.MOUSE_EXITED:
               listener.mouseExited(e);
               break;
           case MouseEvent.MOUSE_ENTERED:
               listener.mouseEntered(e);
               break;
         }
     }
 }