class A {  // スーパークラスA
  int i;
  void m() { System.out.println( "m() of A" ); }
  void h() { System.out.println( "h() of A" ); }
}

class B extends A {  // サブクラスB
  // B型独自のメンバjとg()
  int j;
  void g() { System.out.println( "g() of B" ); }
}

public class Inheritance1 {
  static void f( A objA ) {}
  public static void main( String args[] ) {
    B objB = new B();
    // B型オブジェクトは，クラスAのメンバを継承する
    objB.i = 10;
    objB.m();
    objB.h();
    System.out.println( "-------------" );
    
    // B型オブジェクトには，B型独自のメンバもある
    objB.j = 11;
    objB.g();
    System.out.println( "-------------" );

    // B型オブジェクトをA型変数に代入することができる
    A objA = new B();
    f( new B() );
    
    // B型オブジェクトをA型オブジェクトの一種として扱
    // い，そのメンバを利用する
    objA.i = 12;
    objA.m();
    objA.h();

    // 変数objAの静的な型はA型なので，B型独自のメンバ
    // は利用できない(利用しようとするとコンパイルエ
    // ラーになる)。
    // objA.j = 12;  // コンパイルエラー
    // objA.g();     // コンパイルエラー
  }
}
