使用 Eclipse,我决定实现一个interface
. Eclipse 自动生成方法签名。
接口中的一些方法将参数传递给方法。这些参数从何而来?它们不在我正在实现的界面中,对吗?
比如在实现ActionListener
接口的时候,我们就强制实现这个方法:
@Override
public void actionPerformed(ActionEvent arg0){
...
}
ActionEvent
物体从哪里来?
使用 Eclipse,我决定实现一个interface
. Eclipse 自动生成方法签名。
接口中的一些方法将参数传递给方法。这些参数从何而来?它们不在我正在实现的界面中,对吗?
比如在实现ActionListener
接口的时候,我们就强制实现这个方法:
@Override
public void actionPerformed(ActionEvent arg0){
...
}
ActionEvent
物体从哪里来?
现在,这些参数从何而来?它们肯定不在我正在实现的接口中,对吧?
其实,错了。它们是您正在实现的接口的一部分。
让我们ActionListener
举个例子。从文档中:
void actionPerformed(ActionEvent e)
^^^^^^^^^^^^^
Java 中的接口定义可以被认为更像是合同或承诺,而不是其他任何东西。通过声称实现一个接口,一个类承诺它将实现其中定义的方法。例如,实现ActionListener
承诺的类为方法提供实现,该方法actionPerformed
不返回任何内容,并且需要将ActionEvent
对象传递给方法。
只有当方法被其他类调用时,ActionEvent
对象才需要存在并传入。在接口定义和类的实现中,它只是假设ActionEvent
将传入一个。仅此而已。它与任何其他接受参数的方法完全相同——调用者必须提供有问题的数据,并且该方法只是使用它。
至于为什么actionPerformed
需要一个ActionEvent
,可以在两个不同的层面上回答:
ActionListener
通过要求确切的方法签名来强制它。(这是“如果我不这样做,为什么它不会编译”的答案。)ActionListener
应该监听“动作事件”,所以很自然地应该传入一个带有动作事件信息的对象。实现类有责任对提供的信息采取行动。这是“他们为什么以这种特殊的方式做到这一点”的答案。)这一切的意义何在?答案是多态性:在 的情况下ActionListener
,可以使用 Swing 组件注册具有不同实现的整个组ActionListeners
,并且所有这些都可以以相同的方式调用,因为它们都保证有一个方法void actionPerformed(ActionEvent e)
。这意味着 Swing 组件可以只关心每个侦听器的接口(预期的行为是什么),而不是实现(该行为如何实际工作和/或如何调用它)。
这里的 ActionEvent 是需要提供给 actionPerformed 的,它在 API 中这样说
许多编程都使用预先存在的工具。即,如果我想制作井字游戏,您可以在其中单击 - 我必须使用 ActionEvent 或 java.MATH