JavaFX应用程序类-默认构造函数和init方法之间的差异

JavaFX应用程序类-默认构造函数和init方法之间的差异,java,javafx,Java,Javafx,我编写了一个小测试应用程序,如下所示: import javafx.application.Application; import javafx.application.Platform; import javafx.stage.Stage; public class Test extends Application { public Test() { System.out.println("first"); } @Override publ

我编写了一个小测试应用程序,如下所示:

import javafx.application.Application;
import javafx.application.Platform;
import javafx.stage.Stage;

public class Test extends Application {

    public Test() {
        System.out.println("first");
    }

    @Override
    public void init() throws Exception {
        System.out.println("second");
        super.init();
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        System.out.println("third");
        Platform.exit();
    }

    @Override
    public void stop() throws Exception {
        System.out.println("fourth");
        super.stop();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
输出为:

first
second
third
fourth
现在,我在问自己,使用默认构造函数还是使用
init
方法初始化一些必需的东西之间的区别在哪里

谢谢


注:这个问题与没有重复,因为我的问题不涉及变量的初始化。我的问题是
JavaFX
specific

应用程序类具有您已重写的init()方法。 Init方法将在测试类构造之后立即调用。 Init方法实际上是应用程序类的内部方法。此方法实际上是在内部初始化整个FX应用程序组件


它可以用此方法构造其他JavaFX对象。

启动
应用程序时,在启动过程中执行以下步骤:

  • 将创建应启动的
    应用程序
    子类的实例。(调用构造函数)
  • 调用该实例的
    init()
  • 调用该实例的
    start
    方法
  • 由于调用了
    start
    方法之后,您就可以调用实例的
    stop
    方法

    请注意,不需要使用
    super.init()
    super.stop()

    来自javadoc

    init
    stop
    方法具有不做任何事情的具体实现



    构造函数、
    init
    start
    的区别是:

    建造师 如果您的应用程序不是
    final
    ,则可以扩展应用程序类。由于扩展类的构造函数不完整,因此在这种状态下将对该类的引用传递给其他类可能是危险的。此外,该实例尚未初始化到
    getParameters
    方法返回参数的点

    init
    通常应使用此方法进行初始化。此方法不是从fx应用程序线程运行的,因此某些事情无法通过此方法完成,例如创建
    阶段

    开始

    初始化的最后一步。在这里执行需要从应用程序线程运行的操作。但是,请注意不要用长时间运行的操作阻塞该线程,因为这会冻结GUI

    可能唯一的区别是,在
    init
    中,您可以获得参数-请参阅,您在这里所说的一切对于构造函数也是正确的。