侦听器和适配器之间有什么区别?
我试图区分侦听器和适配器。
它们是否几乎相同,但在侦听器中,您必须实现接口中的所有方法,但是使用适配器,您可以选择仅实现所需的方法,以便代码更清晰,更易于阅读?
我还被告知,适配器仅使用一个实现即可实现实例化,并且您无法实例化侦听器,我不完全理解这一点。
有人可以解释一下哪一个更好用,以及你可以用一个做但你不能用另一个做的事情吗?
我试图区分侦听器和适配器。
它们是否几乎相同,但在侦听器中,您必须实现接口中的所有方法,但是使用适配器,您可以选择仅实现所需的方法,以便代码更清晰,更易于阅读?
我还被告知,适配器仅使用一个实现即可实现实例化,并且您无法实例化侦听器,我不完全理解这一点。
有人可以解释一下哪一个更好用,以及你可以用一个做但你不能用另一个做的事情吗?
WindowListener是强制您使用所有方法的,而WindowAdapter是实现的,您只需要处理您感兴趣的方法。interface
override
WindowListener
override
WindowListener
是接口,这意味着你不能实例化 ,而它是具体的类,你可以使用运算符来实例化。WindowListener
WindowAdapter
new
使用 时,代码会更干净,其中类仅重写所需的方法。例如:WindowAdapter
public class CloseListener implements WindowListener {
// im not interest on this event, but still need to override it
@Override
public void windowOpened(WindowEvent e) {
}
// im not interest on this event, but still need to override it
@Override
public void windowClosing(WindowEvent e) {
}
@Override
public void windowClosed(WindowEvent e) {
System.exit(0);
}
// im not interest on this event, but still need to override it
@Override
public void windowIconified(WindowEvent e) {
}
// im not interest on this event, but still need to override it
@Override
public void windowDeiconified(WindowEvent e) {
}
}
使用适配器时,代码更清晰:
// at JFrame class
addWindowListener(new CloseListener());
// reusable Close Listener
public class CloseListener extends WindowAdapter {
@Override
public void windowClosed(WindowEvent e) {
System.exit(0);
}
}
或
addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
System.exit(0);
}
});
所以我建议使用,但不是必须遵循。但是,其中两个 API 大致相同,只是为了方便创建侦听器对象而存在。WindowAdapter
WindowAdapter
编辑:
由于 是 ,您可以在 JFrame 子类中实现它。WindowListener
interface
public class MainWindow extends JFrame implements WindowListener {
// this is ok
}
public class MainWindow extends JFrame, WindowAdapter {
// this is not allow
}
但是你不能用.WindowAdapter
你可以用任何一个做任何事情,但是如果你从接口开始,你的代码将有很多样板。我相信当你尝试它时,你已经注意到了这一点。关于实例化等的陈述是一种非常复杂的说法,并且有很多术语的混淆。你可以写
c.addWindowListener(new WindowListener() {
@Override public void windowActivated(WindowEvent arg0) { }
@Override public void windowClosed(WindowEvent arg0) { System.exit(0); }
@Override public void windowClosing(WindowEvent arg0) { }
@Override public void windowDeactivated(WindowEvent arg0) { }
@Override public void windowDeiconified(WindowEvent arg0) { }
@Override public void windowIconified(WindowEvent arg0) { }
@Override public void windowOpened(WindowEvent arg0) { }
});
或者你可以写
c.addWindowListener(new WindowAdapter() {
@Override public void windowClosed(WindowEvent arg0) { System.exit(0); }
});
在这两种情况下,您都没有实例化任何一个,或者 - 您正在创建实现 /extend 的匿名类。但是当你直接实现接口时,你被迫实现所有的方法,当你扩展适配器类时,你只能重写你需要的东西。该类已经具有您必须在案例中编写的这些空实现。WindowListener
WindowAdapter
WindowListener
WindowAdapter
Listener