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();