You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

继承JavaFX Application类的重写方法启动时被忽略的原因?

JavaFX Application子类重写方法不生效的原因及解决办法

当调用JavaFXApp.main(args)时输出"default"符合预期,但调用JavaFXAppExtended.main(args)时,子类重写的initialize()方法未被执行,仍输出"default"。

问题代码

父类JavaFXApp

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

public class JavaFXApp extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {
        initialize();
        stage.show();
    }

    public void initialize() {
        System.out.println("default");
    }
}

子类JavaFXAppExtended

public class JavaFXAppExtended extends JavaFXApp {
    @Override
    public void initialize() {
        System.out.println("extended");
    }
}

原因分析

问题核心在于Application.launch()方法的执行逻辑:

  • 无类参数的launch(args)会在调用栈中查找包含当前main方法的Application子类,并实例化该类。
  • 由于子类JavaFXAppExtended未重写main方法,调用JavaFXAppExtended.main(args)时实际执行的是父类JavaFXApp的main方法,此时launch(args)会将JavaFXApp认定为启动类,创建父类实例,因此调用的是父类的initialize()方法。

解决办法

方式1:子类重写main方法,明确指定启动类

在子类中添加独立的main方法,调用带类参数的launch方法,强制启动子类实例:

public class JavaFXAppExtended extends JavaFXApp {
    @Override
    public void initialize() {
        System.out.println("extended");
    }

    public static void main(String[] args) {
        launch(JavaFXAppExtended.class, args);
    }
}

方式2:调整父类设计(可选)

如果需要父类适配所有子类,可将父类改为抽象类,并要求子类必须实现启动逻辑;或者通过反射动态获取调用者类,但这种方式复杂度较高,实际开发中更推荐方式1。

内容的提问来源于stack exchange,提问作者elai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 11:57:37