////////////////////////////////////////////////////////////////////////////////
//  << j244c.java >>
//
//  クラス(4):継承(オーバーライド、性質3)
//
//  Child objc = new Child();
//    Parent objp = objc;
//
//  (性質3) 親クラスで定義されたメソッドm()が、子クラスでオーバーライドされて
//          いるとき、objp.m()で呼び出されるのは、親クラスで定義された
//             メソッドではなく、子クラスでオーバーライドされたメソッドになる。
//
//  (1)子クラスのオブジェクトobjcの作成。
//  (2)子クラスのオブジェクトobjcを親クラスの変数objpに代入。
//  (3)親クラスのオブジェクトobjpでメソッドmの呼び出し。
//      親クラスのメソッドmではなく、子クラスでオーバライドされたメソッドmが
//     呼び出される。
//
///////////////////////////////////////////////////////////////////////////////

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

class Child extends Parent {
  void m() {
    System.out.println("子クラスでオーバーライドしたメソッド(m)");
  }
}

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

    Child objc = new Child(); //(1)
    Parent objp = objc; //(2)

    System.out.print("(3)objp.m():"); objp.m();

  }

}
実行結果
% javac j244c.java
% java j244c
(3)objp.m():子クラスでオーバーライドしたメソッド(m)