我正在尝试为JFrame
关闭操作添加一个监听器:
addWindowListener(new WindowListener() {
@Override
public void windowClosing(WindowEvent e) {
setVisible(false);
}
});
问题是Eclipse一直告诉我必须“添加未实现的方法”,我认为它来自WindowListener
。但是,我很困惑,为什么你需要实现所有这些其他方法,如果你只需要覆盖一个?如果我确实添加了所有其他方法,但不要在其中添加任何内容,例如
@Override
public void windowActivated(WindowEvent e) {}
此方法的默认行为是否会丢失?或者如果我在方法中写一些内容,它只会被覆盖吗?
答案 0 :(得分:6)
如果实现接口,则必须实现所有方法。这也适用于匿名类。
使用link而非实施WindowListener
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
setVisible(false);
}
});
WindowAdapter
是一个用空方法实现WindowListener
的类,让你只覆盖你需要的那些。
PS:还有其他适合其他活动的适配器。例如。 WindowAdapter
,MouseAdapter
答案 1 :(得分:4)
是的,您必须实施所有方法。
这就是interfaces的工作方式:它们定义了实施者必须遵循的合同。如果该合同包含5种方法,那么您必须实施所有5种方法。
当存在相应数量的方法时,通常会使用适配器设计模式:创建一个不执行任何操作的默认实现的抽象类。
对于WindowListener
界面,这是WindowAdapter
。因此,您可以只扩展WindowListener
并仅覆盖所需的方法,而不是实现WindowAdapter
(及其所有方法)。
答案 2 :(得分:0)
没有默认行为,这就是您需要提供实现(预期行为)的原因。
只要你有一个具体的类扩展一个抽象类,或者实现一个接口,它必须为所有抽象方法提供一个实现。
这可以通过(其他)超类或类本身来完成,但是,它是强制性的。
一旦添加方法,就覆盖它,但由于之前没有实现,因此这些方法没有“默认行为”可以丢失。