2017-02-12 15 views
-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()方法不覆盖超类的方法?

+7

您没有'EuclideanSearch'和'ChebyshevDistance';你有两个空值。这段代码会因'NullPointerException'而崩溃。 – user2357112

+1

请理解,对象的类不一定与引用它的变量的类型相同。当你在你的代码中写入一些东西,例如'new EuclideanSearch()',这就是控制被创建的对象的类 - 这就是控制你的方法的哪个版本实际上会被调用的东西。您分配创建的对象的变量的类型与调用哪个方法无关。 –

回答

0

您将获得NullPointerException异常调用so.heuristic(),因为你没有实例类,使用这些代码:

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

但不足以解决你的问题,你应该实现A启动界面通过不同的类。不要忘记实现一个接口的类应该实现所有的接口方法。否则,你应该定义一个抽象类来定义只有一些方法并覆盖其他类中的剩余方法并扩展你以前的类。

public class Search implements Astar { 

    @Override 
    public String heuristic() { return "default heuristic"; } 
} 
相关问题