Java中的重写接口方法

Java中的重写接口方法,java,javafx,methods,interface,overriding,Java,Javafx,Methods,Interface,Overriding,我正在尝试使用现有的软件包在上面创建我自己的应用程序。但是,我不知道如何调用接口参数化方法 在使用JavaFX的包中,有一个类的构造函数是 public class App extends Application{ ... protected App(Logic logic) { this(logic.configuration().welcomeScreen, logic.configuration().name, Optional.of(logic)); } } 界面是这样的: p

我正在尝试使用现有的软件包在上面创建我自己的应用程序。但是,我不知道如何调用接口参数化方法

在使用JavaFX的包中,有一个类的构造函数是

public class App extends Application{
...
protected App(Logic logic) {
    this(logic.configuration().welcomeScreen, logic.configuration().name, Optional.of(logic));
}
}
界面是这样的:

public interface Logic extends X, Y {

default Configuration configuration() {
    return new Configuration(1000, "Hello world", true);
}
default void initialize() {
    System.out.println("Starting the application.");
}
}
配置如下:

public final class Configuration {
public final int tick;
public final String name;
public final boolean welcomeScreen;

public Configuration(int tick, String name, boolean welcomeScreen) {
    this.tick = tick;
    this.name = name;
    this.welcomeScreen = welcomeScreen;
}
}
应用程序的输出:

 (1000, "Hello world", true)
现在,当我创建自己的应用程序扩展时,覆盖不会通过:

public class Test extends App implements Logic{  
@Override
public Configuration configuration() {
    return new Configuration(25, "Test", true);
}

public static void main(String[] args) {

launch(args); //launches the App
}

}
输出:

(1000, "Hello world", true)
应用程序仍然调用接口的默认方法。
出现这种情况的原因是什么?在这种情况下如何绕过默认方法?

子类应该声明一个显式调用以下父构造函数的构造函数:

protected App(Logic logic) {
    this(logic.configuration().welcomeScreen, logic.configuration().name, Optional.of(logic));
}
否则它将不会根据发布的代码编译。。。如果它编译,则意味着父类有一个无参数构造函数。它将被隐式调用(在编译的类中),而这不是使用重写的
configuration()
方法所要调用的

应用程序和逻辑不应在
测试中耦合

因此,您可以引入一个类来定义
逻辑
子类:

public TestLogic implements Logic{         
  @Override
  public AppConfiguration configuration() {
    return new AppConfiguration(25, "Test", true);
  }
}
并添加
Test
构造函数以通过
Logic
实例(此处
this
):


这是一个JavaFX应用程序,所以
Test
可能会在后台自动实例化。听起来不错。我对JavaFX了解不多。谢谢。出现
错误:在调用超类型构造函数之前,无法引用此
super(this)
。尝试执行
应用程序(此)
,但无法识别应用程序。应用程序类不应该先加载吗?编辑:我的坏朋友没有看到评论说它就在这里。我看不到将接口作为参数传递给构造函数的方法。我的方法也不好。我忘记了一条基本规则:构造函数在调用构造函数时不能引用此
。我更新了。您如何打印输出?不带参数的
App
的构造函数在哪里?(如果超类中有可用的构造函数,
Test
中没有构造函数实现,这将导致编译时错误。)您是否绝对确定启动的是
Test
(do
System.out.println(getClass());
检查)。此外,请注意
App
构造函数调用
configuration()
两次,这将创建2个实例,而不是1个。您应该添加一个包含两个参数的私有构造函数,
Configuration
Logic
,以避免出现这种情况。
public class Test extends App {     
  public Test() {
     super(new TestLogic());
  } 
}