Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,如何从超类调用子类方法?_Java_Inheritance_Subclass_Superclass - Fatal编程技术网

在Java中,如何从超类调用子类方法?

在Java中,如何从超类调用子类方法?,java,inheritance,subclass,superclass,Java,Inheritance,Subclass,Superclass,我在这里到处找了找我的问题的答案,但我找不到。在Java中,如何从超类调用子类方法 基本上,我想做的是:我有一个名为exec的方法,它将字符串作为命令的参数。我希望能够在开发人员已从超类重写的子类中调用exec方法,而不必提前知道子类的名称 这与Thread类的工作方式类似。我不想做我找到的每一个答案都做的事情,那就是超类对象=新的子类;然后只需调用object.method 这是超类中的代码 import javafx.application.*; import javafx.stage.*;

我在这里到处找了找我的问题的答案,但我找不到。在Java中,如何从超类调用子类方法

基本上,我想做的是:我有一个名为exec的方法,它将字符串作为命令的参数。我希望能够在开发人员已从超类重写的子类中调用exec方法,而不必提前知道子类的名称

这与Thread类的工作方式类似。我不想做我找到的每一个答案都做的事情,那就是超类对象=新的子类;然后只需调用object.method

这是超类中的代码

import javafx.application.*;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.input.*;
import javafx.scene.text.Text;



public abstract class Console extends Application {
    private String title;
    private static Text output = new Text();


    public void create(String title) {
        this.title = title;
        launch();
    }

    public void start(Stage stage) {
        stage.setOnCloseRequest((WindowEvent event) -> {
            System.exit(0);
        });
        stage.setTitle(title);
        stage.setResizable(false);
        Group root = new Group();
        Scene scene = new Scene(root, 800, 400);
        stage.setScene(scene);
        ScrollPane scroll = new ScrollPane();
        scroll.setContent(output);
        scroll.setMaxWidth(800);
        scroll.setMaxHeight(360);
        TextField input = new TextField();
        input.setLayoutX(0);
        input.setLayoutY(380);
        input.setPrefWidth(800);
        scene.setOnKeyPressed((KeyEvent event) -> {
            if(event.getCode() == KeyCode.ENTER) {
                exec(input.getText());
                input.clear();
            }
        });
        root.getChildren().add(scroll);
        root.getChildren().add(input);
        stage.show();
    }
    public static void appendOutput(String value) {
         Platform.runLater(() -> {
            output.setText(output.getText() + "\n" + value);
        });
    }
    protected abstract void exec(String command);
}
[…]我有一个名为exec的方法,它将字符串作为命令的参数。我希望能够在开发人员已从超类重写的子类中调用exec方法,而不必提前知道子类的名称

你不必做任何特别的事。您只需从基类的代码中调用它。Java中的所有方法都是虚拟的,因此将调用子类的重写实现

下面是一个演示:

public class Test {
    public static void main(String[] args) {
        Console console = new ConsoleSubclass();
        console.start();
        console.keyPressed();
    }
}

abstract class Console {

    Runnable keyPressedHandler;

    private void setOnKeyPressed(Runnable handler) {
        keyPressedHandler = handler;
    }

    public void keyPressed() {
        keyPressedHandler.run();
    }

    public void start() {
        setOnKeyPressed(() -> {
            exec();
        });
    }

    abstract void exec();
}

class ConsoleSubclass extends Console {
    @Override
    void exec() {
        System.out.println("In ConsoleSubclass");
    }
}

我具体的JavaFX子类化问题的答案在这里。对于一般的子类化,这里的答案已经足够了。

简单的答案:你不能。。。你有代码要显示吗?你没有。超类不应该知道它的子类。你不应该知道-这就是继承的目的。@R4J:胡说八道。超类非常了解它们的子类,并且可以通过定义契约知道子类将有一个特定的方法;i、 e.在父级中声明方法通常是抽象的。@Mark Peters这实际上可能就是我要寻找的答案。基类是什么意思?答案有点误导。您不必从基类调用它。。如果方法x是在超类中定义的,并且在子类中被重写,那么任何引用该子类的对象的类都可以调用objectReference.x,并且调用子类中的方法。即使该引用的声明类型是超类的类型,这也是正确的。稍微更新了答案。我不确定我明白你的意思。在OPs的例子中,他想从超类调用子类实现。@Scoopta,基类是超类的同义词。是的……那就行了,我只剩下一个问题了。如果你看一下我原始问题中的代码。我希望它在用户按enter键时执行exec方法。问题是调用仅存在于超类中,并通过EventHandler调用
public class UsingClass

{
  SuperClassType x = null;
  x = goGetClassReference(); // this can get an instance of SuperClassType,
                             // or of any subclass of it.
  x.methodName();  // this calls methodName on the class obtained above; 
        //if goGetClassReference got a subclass, this calls methodName() on the subclass.
}