-3
我正在尝试使用不同的启发式方法对知情搜索进行抽象算法类。我的想法是让不同的子类覆盖默认的heuristic()方法,但是当我调用子类时,动态绑定似乎不起作用。尽管明确使用了@Override,但是Java子类方法并没有被覆盖。
在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()
方法不覆盖超类的方法?
您没有'EuclideanSearch'和'ChebyshevDistance';你有两个空值。这段代码会因'NullPointerException'而崩溃。 – user2357112
请理解,对象的类不一定与引用它的变量的类型相同。当你在你的代码中写入一些东西,例如'new EuclideanSearch()',这就是控制被创建的对象的类 - 这就是控制你的方法的哪个版本实际上会被调用的东西。您分配创建的对象的变量的类型与调用哪个方法无关。 –