オブジェクト指向に基づくプログラミング言語は継承という概念を用いています。 継承は大変便利な機能なのですが、 親クラスと子クラスのうちのどちらの変数やメソッドが使われるのかが わかりにくい場合があります。
Java言語の場合について、簡単に解説します。
下の例では、変数xの型はクラス A ですが、実際の値としてはクラスBのインスタンスが入っています。 この場合、
A.java |
public class A { static int p; int q; public A() { p = 1; q = 2; } static int f() { return 5; } int g() { return 6; } } |
B.java |
public class B extends A { static int p; int q; public B() { p = 3; q = 4; } static int f() { return 7; } int g() { return 8; } } |
Main.java |
public class Main { public static void main(String[] args) { A x = (A) new B(); System.out.println("x.p = " + x.p); System.out.println("x.q = " + x.q); System.out.println("x.f() = " + x.f()); System.out.println("x.g() = " + x.g()); } } |
Main.javaの実行例 |
[nitta@ni methodcall]$ javac Main.java A.java B.java [nitta@ni methodcall]$ java Main x.p = 1 <---クラスAのp x.q = 2 <---クラスAのq x.f() = 5 <---クラスAのf() x.g() = 8 <---クラスB !!のg() |
RunAStar.java で Node クラスの代りに NodeGeoクラスのインスタンスを PFSearch クラスに渡しています。 ですので、プライオリティキューから最小の NodeGeo オブジェクトを選ぶ際に、 NodeGeoクラスの compareTo() メソッドが呼ばれることになり、 A* アルゴリズムで動作したのでした。