public class A {
public void A1() {
System.out.println("calling A1 of A.");
}
public void A2() {
System.out.println("calling A2 of A.");
}
public static void main(String args[]) {
A a = new A(); B b = new B();
a.A1(); b.A1(); b.A2();
}
}
class B extends A {
public void A1() {
System.out.println("calling A1 of B.");
}
}
このプログラムを実行すると,以下のようになる.
calling A1 of A. calling A1 of B. calling A2 of A.一行目は, a.A1() に相当する処理で,クラス A より生成したオ ブジェクト a のメソッドを呼出し, 二行目は, b.A1() に相当する処理で,クラス B より生成したオ ブジェクト b でオーバーライドしたメソッドを呼出している. 最後の行では, b.A2() に相当する処理で,クラス B が 親クラス A で定義されたメソッド A2 を継承したことを示して いる.
「継承」さらに,ここで定義した「オーバーライド」を多用すればより複雑な関係な どを記述することができるが,慣れないとどのような処理をするかわからな くなるので注意が必要である.例えば,上の例で main メソッドでの オブジェクト生成で,
A a = new B();
この性質を サブシューム(subsume) という.また,クラス
から生 成されたインスタンス
は,クラス
に「サブシュームされた」という. この性質は,Java のような 「クラス=型」 とするオブジェ クト指向言語で成立する性質である5
さて,この性質を使って,
A a = new B();
a.A1();