当接口自动实现时,参数来自何处?

时间:2013-01-30 19:42:27

标签: java interface polymorphism

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

界面中的一些方法将参数传递给方法。这些参数来自哪里?它们不在我正在实现的界面中,对吗?

例如,在实现ActionListener接口时,我们被迫实现此方法:

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

ActionEvent对象来自哪里?

3 个答案:

答案 0 :(得分:4)

  

现在,这些参数来自哪里?它们肯定不在我正在实现的界面中,对吧?

实际上,错了。他们 是您正在实施的界面的一部分。

我们以ActionListener为例。来自documentation

void actionPerformed(ActionEvent e)
                     ^^^^^^^^^^^^^

答案 1 :(得分:3)

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

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

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

  1. 因为ActionListener的接口定义要求使用精确的方法签名来强制它。 (这就是“如果我不回答,为什么不编译。”
  2. 因为创建接口的Java API设计者决定接口的工作方式。 (这是有道理的,因为ActionListener应该监听“动作事件”,所以具有动作事件信息的对象应该被传入是很自然的。实现类的责任是作用于提供的信息。这就是“为什么他们以这种特殊方式做出回答”。)
  3. 所有这一切的重点是什么?答案是polymorphism:在ActionListener的情况下,可以使用Swing组件注册具有不同实现的整个ActionListeners组,并且所有这些组都可以被调用因为他们都保证有方法void actionPerformed(ActionEvent e)。这意味着Swing组件只能担心每个侦听器的接口(预期行为是什么),而不是实现(该行为实际上如何工作和/或如何调用它)。

答案 2 :(得分:2)

ActionEvent是需要提供给actionPerformed的内容,它是这样说的here in the API

许多编程都使用预先存在的工具。即如果我想制作一个井字游戏,你点击一下 - 我必须使用ActionEvent或java.MATH