////////////////////////////////////////////////////////////////////////////////
//  << j244d.java >>
//
//  クラス(4):継承(オーバーライド)
//
//   オブジェクトの多態性の性質3から、共通の親クラスを持つ子クラスの
//  メソッドがオーバーライドされていてもオブジェクトを統一的に扱うことができる。
//
//  (1)親クラスの配列objp[]を準備。
//  (2)子クラス(Child0)のオブジェクトobj[0]を作成。
//  (3)子クラス(Child1)のオブジェクトobj[1]を作成。
//  (4)親クラスのオブジェクトobj[2]を作成。
//  (5)フィールドの場合、親クラスのフィールドが選択される。
//  (6)メソッドの場合、オーバーライドされた子クラスのメソッドが選択される。
//
///////////////////////////////////////////////////////////////////////////////

class Parent {
  int a = 111;
  void m() {
    System.out.println("親クラスのメソッド(m)");
  }
}

class Child0 extends Parent {
  int a = 222;
  void m() {
    System.out.println("子クラス(Child0)でオーバーライドしたメソッド(m)");
  }
}
class Child1 extends Parent {
  int a = 333;
  void m() {
    System.out.println("子クラス(Child1)でオーバーライドしたメソッド(m)");
  }
}

class j244d {
  public static void main(String args[]) {

    Parent objp[] = new Parent[3]; //(1)

    objp[0] = new Child0(); //(2)

    objp[1] = new Child1(); //(3)

    objp[2] = new Parent(); //(4)

    for( int i=0; i<objp.length; i++ ) {
      System.out.println("(5)objp[" + i + "].a:" + objp[i].a);
    }
    System.out.println();

    for( int i=0; i<objp.length; i++ ) {
      System.out.print("(6)objp[" + i + "].m():"); objp[i].m();
    }
  }
}
実行結果
% javac j244d.java
% java j244d
(5)objp[0].a:111
(5)objp[1].a:111
(5)objp[2].a:111

(6)objp[0].m():子クラス(Child0)でオーバーライドしたメソッド(m)
(6)objp[1].m():子クラス(Child1)でオーバーライドしたメソッド(m)
(6)objp[2].m():親クラスのメソッド(m)