Java抽象类混淆:未被调用的重写方法

Ada*_*lor 3 java abstract-class

所以我有两个班级。一种是抽象的:

public abstract class AbstractClient {
    protected boolean running = true;

    protected void run() {
        Scanner scanner = new Scanner(System.in);
        displayOptions();
        while (running) {
            String input = null;
            while (scanner.hasNext()) {
                input = scanner.next();
            }
            processInputCommand(input);
        }
    }

    abstract void displayOptions();

    abstract void processInputCommand(String input);

}
Run Code Online (Sandbox Code Playgroud)

一种是具体的子类:

public class BasicClient extends AbstractClient {
    private IBasicServer basicServer;

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

    public BasicClient() {
        try {
            System.setSecurityManager(new RMISecurityManager());
            Registry registry = LocateRegistry.getRegistry();
            basicServer =  (IBasicServer) registry.lookup(IBasicServer.LOOKUPNAME);
            run();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    void displayOptions() {
        BasicClientOptions.displayOptions();

    }

    @Override
    void processInputCommand(String input) {
        // TODO Auto-generated method stub

    }
}
Run Code Online (Sandbox Code Playgroud)

现在在子类中,我调用抽象类的 run() 方法,因为这对所有客户端都是通用的。在 run() 方法内部是对抽象方法 displayOptions() 的调用。

我在子类中覆盖了 displayOptions() 所以我假设它会调用子类的方法,但似乎没有。有没有办法做到这一点,或者我犯了一个明显的错误,或者我误解了抽象类应该如何工作?

PS 我尝试在子类 displayOptions() 中放置一个打印语句,以确保我没有用我调用的方法做一些愚蠢的事情。

非常感谢,

亚当

小智 5

也许你的BasicClientOptions.displayOptions()电话有问题。我想知道你怎么知道这BasicClient.displayOptions()不是被调用的。

这是您所拥有的简化版本。尝试运行它。它以您期望的方式运行。

public abstract class BaseClass {
    public void run() { foo(); }
    public abstract void foo();
}

public class Subclass extends BaseClass {

    public static void main(String[] args) { new Subclass().run(); }

    @Override
    public void foo() {
        System.out.println("I'm from the subclass");
    }
}
Run Code Online (Sandbox Code Playgroud)