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