Javaについて補足説明
オブジェクト指向に基づくプログラミング言語は継承という概念を用いています。
継承は大変便利な機能なのですが、
親クラスと子クラスのうちのどちらの変数やメソッドが使われるのかが
わかりにくい場合があります。
Java言語の場合について、簡単に解説します。
Javaのメソッドコール
下の例では、変数xの型はクラス A ですが、実際の値としてはクラスBのインスタンスが入っています。
この場合、
- クラス・フィールド x.p へのアクセス
- インスタンス・フィールド x.q へのアクセス
- クラス・メソッド x.f() の呼び出し
に関してはどれもコンパイル時に決定され、変数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* アルゴリズムで動作したのでした。