喵喵时光机
我认为这曾经是 AWT 的问题。IIRC 这些类提供了一个不执行任何操作的默认方法,您可以重载它 - 为了执行诸如发送应用程序正在关闭的任何适当通知、保存任何未保存的数据、释放您存储的任何资源等操作等等等等。从这个角度来看,这是有道理的。框架不知道您在关闭时要做什么,因此它为您的代码提供了一个位置。由于这个(或任何“为什么?”问题)有点哲学性,请允许我通过一个简短的转移来深入探讨这个问题,它说明了解决同一问题的不同方法:在 Mac 上,“代表”有相似但不同的概念。例如,我不会将 Window 子类化,而是将 Window 交给一个“Window-Lifecycle-Delegate-iser”,然后 api 将在发生时调用我的委托上的适当方法。这在一定程度上对于 Mac 来说效果很好,因为 Objective-C 比 Java 更接近 Smalltalk 风格。特别是,您可以向对象发送一条消息(读作:调用方法),如果该对象没有说出该消息(读作:该对象上没有相应的方法),那么在 Objective-C 中,它就会无处可去,而在爪哇它却尖叫着死去。因此,在 Java 中,您必须实现接口上的每个方法,而对于 Objective-C,您只需执行您真正关心的方法。因此,您可以创建一个大型 API,其中可能会对委托进行 50-100 次调用,并且您不会让开发人员不知所措,因为他们可以忽略其中的 95-99%。以下是 Java SE 教程中的一些代码:public class HelloWorldSwing {/** * Create the GUI and show it. For thread safety, * this method should be invoked from the * event-dispatching thread. */ private static void createAndShowGUI() { //Create and set up the window. JFrame frame = new JFrame("HelloWorldSwing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);所以在这里我们看到我们有这个方法,它创建一个 JFrame(一个奇特的窗口),然后立即指定当用户尝试退出时它希望应用程序的行为如何进行。在这种情况下,他们只是选择批量标准选项。EXIT_ON_CLOSE 不是唯一的选项,您可能会发现查看它们很有趣。这很重要,因为稍后:public static void main(String[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application's GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } });}我们看到该应用程序正在其自己的线程内运行。因此,在幕后,计算机有某种无限循环来保持 UI 的活力。这部分需要知道可以打破该循环并让线程死亡。(invokeLater、Runnable 和 run 都是我们在这里处理线程的线索:D)