Java 尽管显式使用了@Override,但子类方法并未被覆盖

Java subclass methods are not overriding despite explicit use of @Override

我正在尝试制作一个抽象算法 class 以使用不同的启发式进行明智的搜索。我的想法是让不同的 subclasses 覆盖默认的 heuristic() 方法,但是当我调用 subclasses.

时动态绑定似乎不起作用

astar.java:

public interface Astar {
    abstract String heuristic();
}

search.java

public class Search implements Astar {
    public String heuristic() { return "default heuristic"; }
}

EuclidianSearch.java:

public class EuclidianSearch extends Search {
    @Override
    public String heuristic() { return "Euclidian"; }
}

ChebyshevSearch.java:

public class ChebyshevSearch extends Search {
    @Override
    public String heuristic() { return "Chebyshev"; }
}

main.java:

EuclidianSearch e_search = null; ChebyshevDistance ch_search = null;
Search[] SearchObjects = {e_search, ch_search};

for(Search so : SearchObjects) {
    System.out.println(so.heuristic());
}

当运行时,显示:

default heuristic
default heuristic

我根据 Search 定义数组,这样我就可以更灵活:最终,我想要五个或更多不同的启发式方法。为什么 subclass 的 heuristic() 方法不覆盖 superclass 的方法?

您将在调用 so.heuristic() 时得到 NullPointerException,因为您没有实例化 class,请使用这些代码:

EuclidianSearch e_search = new EuclidianSearch();
ChebyshevDistance ch_search = new ChebyshevDistance();

但这还不足以解决您的问题,您应该通过不同的 classes 实现 AStart 接口。不要忘记实现接口的 class 应该实现所有接口方法。否则,您应该定义一个抽象 class 来仅定义一些方法并覆盖其他 class 中的剩余方法,并扩展您之前的 class.

public class Search implements Astar {

    @Override
    public String heuristic() { return "default heuristic"; }
}