2

使用 Eclipse,我决定实现一个interface. Eclipse 自动生成方法签名。

接口中的一些方法将参数传递给方法。这些参数从何而来?它们不在我正在实现的界面中,对吗?

比如在实现ActionListener接口的时候,我们就强制实现这个方法:

@Override
public void actionPerformed(ActionEvent arg0){
...
}

ActionEvent物体从哪里来?

4

3 回答 3

4

现在,这些参数从何而来?它们肯定不在我正在实现的接口中,对吧?

其实,错了。它们您正在实现的接口的一部分。

让我们ActionListener举个例子。从文档中:

void actionPerformed(ActionEvent e)
                     ^^^^^^^^^^^^^
于 2013-01-30T19:44:11.950 回答
3

Java 中的接口定义可以被认为更像是合同或承诺,而不是其他任何东西。通过声称实现一个接口,一个类承诺它将实现其中定义的方法。例如,实现ActionListener承诺的类为方法提供实现,该方法actionPerformed不返回任何内容,并且需要将ActionEvent对象传递给方法。

只有当方法被其他类调用时,ActionEvent对象才需要存在并传入。在接口定义和类的实现中,它只是假设ActionEvent将传入一个。仅此而已。它与任何其他接受参数的方法完全相同——调用者必须提供有问题的数据,并且该方法只是使用它。

至于为什么actionPerformed需要一个ActionEvent,可以在两个不同的层面上回答:

  1. 因为接口定义ActionListener通过要求确切的方法签名来强制它。(这是“如果我不这样做,为什么它不会编译”的答案。)
  2. 因为创建接口的 Java API 设计者决定接口应该是这样工作的。(这是有道理的,因为ActionListener应该监听“动作事件”,所以很自然地应该传入一个带有动作事件信息的对象。实现类有责任对提供的信息采取行动。这是“他们为什么以这种特殊的方式做到这一点”的答案。)

这一切的意义何在?答案是多态性:在 的情况下ActionListener,可以使用 Swing 组件注册具有不同实现的整个组ActionListeners,并且所有这些都可以以相同的方式调用,因为它们都保证有一个方法void actionPerformed(ActionEvent e)。这意味着 Swing 组件可以只关心每个侦听器的接口(预期的行为是什么),而不是实现(该行为如何实际工作和/或如何调用它)。

于 2013-01-30T19:47:49.793 回答
2

这里的 ActionEvent 是需要提供给 actionPerformed 的,它在 API 中这样说

许多编程都使用预先存在的工具。即,如果我想制作井字游戏,您可以在其中单击 - 我必须使用 ActionEvent 或 java.MATH

于 2013-01-30T19:44:21.337 回答