尽管明确使用了@Override,但Java子类方法并没有覆盖

时间:2017-02-12 04:55:22

标签: java inheritance subclass abstract a-star

我正在尝试使用不同的启发式方法为知情搜索创建一个抽象算法类。我的想法是让不同的子类覆盖默认的heuristic()方法,但是当我调用子类时动态绑定似乎不起作用。

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来定义数组,所以我可以灵活:最终,我希望有五种或更多种不同的启发式方法。为什么子类的heuristic()方法不会覆盖超类的方法?

1 个答案:

答案 0 :(得分:0)

调用so.heuristic()会得到NullPointerException,因为你不是实例类,请使用这些代码:

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

但是它不足以解决你的问题,你应该通过diffrent类实现AStart接口。不要忘记实现接口的类应该实现所有接口方法。否则,你应该定义一个抽象类来定义一些方法,并在扩展你之前的类时覆盖其他类中的retain方法。

public class Search implements Astar {

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