////////////////////////////////////////////////////////////////////////////////
//  << j251.java >>
//
//  クラス(5):抽象クラス(概説)
//
//  ●抽象メソッド
//
//  ・処理を記述していないメソッドを抽象メソッドという。
//
//      void am() {
//        この部分が空。
//      }
//
//  ・メソッド名、引数リストは記述するが、当面、処理部分は必要ない場合に
//   使われる。
//  ・予約語abstractを使って定義する。
//      abstract 戻り値の型 メソッド名(引数リスト);
//
//  ●抽象クラス
//
//    ・抽象メソッドをもつクラスを抽象クラスという。
//    ・予約語abstractを使って定義する。
//  ・抽象クラスを継承するクラス側で抽象メソッドの実体を定義する。
//
// ●抽象クラスの定義
//                       
//   abstract class 抽象クラス名 {
//        ・・・
//         abstract void am(); // 抽象メソッドの宣言
//      }
//
//  ●抽象クラスを使うプログラムの書き方
//
//      // 抽象クラス
//   abstract class AC {
//        ・・・
//        abstract void m();
//      }
//      // 抽象クラスを継承するクラス
//      class C extends AC {
//        ・・・
//     void am() {
//          処理を記述する。
//        }
//      }
//      class クラス名 {
//        public static void main(String args[]) {
//          C obj = new C();
//          ・・・
//          obj.am();
//        }
//      }
//
//  ・javac クラス名.java でコンパイルすると、3つのクラスファイル
//   (クラス名.class, C.class, AC.class)が作成される。
//
// ●抽象クラスの効果
//      
//  メソッドの名前と引数リストだけ決め、実体は未定義にする抽象クラスを
//  継承するクラスでは、抽象メソッドのオーバーライドを強制される。
//  適切なオーバーライドしなければエラーになる。
//  抽象クラスを親クラスとするとき、メソッド名と引数リストの一貫性を確保できる。
//
///////////////////////////////////////////////////////////////////////////////