gpt4 book ai didi

javafx - 使用父类(super class)扩展 javafx.application.Application。为什么子类中的 Override 会被忽略?

转载 作者:行者123 更新时间:2023-12-02 03:08:33 24 4
gpt4 key购买 nike

我需要定义一个类型的应用程序,从中扩展实际的应用程序(例如在下面的TestApp_sub中)。遗憾的是,这些实际的应用程序重写方法不起作用。看来他们完全被忽视了。应打印以下包

A
B

执行时。但仅打印

A

相反。

<小时/>

代码

基于javafx的父类(super class):

package overrideIssue;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class TestApp_super extends Application {

@Override
public void start(Stage stage) {
Scene scene = new Scene(new Pane(), 640, 480);
stage.setScene(scene);
stage.show();

myMethod();
}

public static void main(String[] args) {
launch();
}

public void myMethod(){
System.out.println("A");
}
}

子类(实际应用程序/包含忽略的覆盖):

package overrideIssue;

public class TestApp_sub extends TestApp_super {

@Override
public void myMethod() {
super.myMethod();
System.out.println("B");
}
}

主要方法:

package overrideIssue;

public class App {
public static void main( String[] args ) {
TestApp_sub.main( args );
}
}
<小时/>

建议

根据javatpoint应满足以下条件:Java 方法重写规则

  • 该方法必须与父类中的方法同名
  • 该方法必须具有与父类中相同的参数。
  • 必须存在 IS-A 关系(继承)。

(但是它是一个javafx.application.Application,它没有实例化为对象。)我在 stackoverflow 上发现了几个看似相似的问题,但我看不到这个问题的解决方案。非常感谢。

最佳答案

来自 Application#launch(String...) 的文档:

Launch a standalone application. This method is typically called from the main method. It must not be called more than once or an exception will be thrown. This is equivalent to launch(TheClass.class, args) where TheClass is the immediately enclosing class of the method that called launch [emphasis added].

在您的情况下,调用 launch 的方法的“直接封闭类”是 TestApp_super 。这意味着它是 TestApp_super它被实例化并用作应用程序类,而不是 TestApp_sub 。换句话说,您没有使用带有重写方法的类,并且您看到的输出是预期的。

要使用您想要的类,至少有三个选项:

  1. 使用 Application#launch(Class,String...) :

    package overrideIssue;

    import javafx.application.Application;

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

    现在您明确告诉 JavaFX 使用哪个类作为应用程序类。您甚至可以添加逻辑来检查命令行参数并决定将哪个类传递给 launch .

  2. 只需使用您想要的应用程序作为主类即可。换句话说,在命令行上指定适当的类。

  3. 添加public static void main(String[])方法TestApp_sub类也是如此。

    package overrideIssue;

    public class TestApp_sub extends TestApp_super {

    public static void main(String[] args) {
    launch(args);
    }

    @Override
    public void myMethod() {
    super.myMethod();
    System.out.println("B");
    }
    }

    这不会覆盖main TestApp_super中的方法类,它只是隐藏它——静态方法不能被覆盖。调用哪个静态方法由调用该方法的声明类型决定;请注意,我说的是声明类型,而不是运行时类型,因为要调用的静态方法是在编译时决定的。由于您使用 TestApp_sub.main(args) TestApp_sub中的方法被调用(假设您已像上面那样添加它)。但是,如果您要使用 TestApp_super.main(args)它将调用 TestApp_super 中的方法无论子类中是否存在具有相同签名的方法。

    现在TestApp_sub是调用 launch 的方法的“直接封闭类”它将是 TestApp_sub已实例化并使用。

关于javafx - 使用父类(super class)扩展 javafx.application.Application。为什么子类中的 Override 会被忽略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59377220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com