这个问题不是关于如何使用接口,而是关于java中的一些预定义接口是如何工作的。
例如,考虑java.awt.event
包中的ActionListener接口。当我们实现接口时,我们必须定义actionPerformed()方法,该方法将在action
发生时被调用。
我想知道的是这是如何工作的。我们不会编写任何检查操作发生的代码,然后调用actionPerformed。界面中的代码也不是。它会自动发生。
谁在做这项工作?
答案 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;
}
}
}