Javaについて補足説明


オブジェクト指向に基づくプログラミング言語は継承という概念を用いています。 継承は大変便利な機能なのですが、 親クラスと子クラスのうちのどちらの変数やメソッドが使われるのかが わかりにくい場合があります。

Java言語の場合について、簡単に解説します。

Javaのメソッドコール

下の例では、変数xの型はクラス A ですが、実際の値としてはクラスBのインスタンスが入っています。 この場合、

に関してはどれもコンパイル時に決定され、変数xの型がクラスAなのでクラスAの方が用いられます。 しかし、 に関しては実行時に動的に決定され、変数xの値がクラスBのオブジェクトなのでクラスBのg()メソッドが呼ばれます。

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* アルゴリズムで動作したのでした。