16‐1
車をモデルとする、次のようなCar01というクラスを作成しなさい。
・機種を表すString型のmodelというフィールドをもつ。
・メーカーを表すString型のmakerというフィールドをもつ。
・コンストラクタの引数で機種とメーカーを指定させる。ただし、コンストラクタの引数の名前はフィールド名と同じにする。
・機種を出力するvoid型のprintModel()というメソッドをもつ。
・メーカーを出力するvoid型のprintMaker()というメソッドをもつ。
・printModel()とprintMaker()を順に呼び出して、機種とメーカーを出力するvoid型のprintData()というメソッドをもつ。
16‐2
上記Car01を継承し、トラックをモデルとする、次のようなTrack01というクラスを作成しなさい。
・積載量を表すint型のloadというフィールドをもつ。
・コンストラクタの引数で機種とメーカーと積載量を指定させる。ただし、コンストラクタの引数の名前はフィールド名と同じにする。
・コンストラクタからスーパークラスのコンストラクタを呼び出す。
・積載量を出力するvoid型のprintLoad()というメソッドをもつ。
16‐3
次のような処理を行うExer16_03というクラスを作成・コンパイル・実行し、結果を確認しなさい。
・機種にELF、メーカーにISUZU、積載量に2を指定して、Track01のインスタンスを生成し、Track01型の変数に代入する。
・機種にCanter、メーカーにMITSUBISHI、積載量に4を指定して、Track01のインスタンスを生成し、Track01型の変数に代入する。
・機種にHiAce、メーカーにTOYOTA、積載量に1を指定して、Track01のインスタンスを生成し、Track01型の変数に代入する。
・変数を利用して各インスタンスのprintData()を呼び出す。
16‐4
16‐3の結果、各インスタンスの機種とメーカーしか出力されません。
そこで、Track01を次のように変更して、Track02というクラスを作成しなさい。
・printData()メソッドをオーバーライドし、機種とメーカーと積載量を出力するようにする。その際、スーパークラスのprintData()を呼び出した後、printLoad()を呼び出すようにしなさい。
16‐5
Exer16_03をTrack02を使用するように変更したExer16_05というクラスを作成・コンパイル・実行し、結果を確認しなさい。
16‐6
左辺がスーパークラス型、右辺がサブクラス型という代入文は有効であることを確認します。
上記Car01とTrack02を使用し、次のような処理を行うExer16_06というクラスを作成・コンパイル・実行しなさい。
・スーパークラス型の変数を宣言する。
・サブクラス型の変数を宣言し、サブクラス型のインスタンスを生成して代入する。
・上記のスーパークラス型の変数にサブクラス型の変数を代入する。
・OKと出力する。
16‐7
Exer16_06を、スーパークラス型の変数に直接サブクラス型のインスタンスを生成して代入するように変更したExer16_07というクラスを作成・コンパイル・実行しなさい。
16‐8
左辺がサブクラス型、右辺がスーパークラス型という代入文は無効であることを確認します。
上記Car01とTrack02を使用し、次のような処理を行うExer16_08というクラスを作成し、コンパイルエラーとなることを確認しなさい。
・サブクラス型の変数を宣言する。
・スーパークラス型の変数を宣言し、スーパークラス型のインスタンスを生成して代入する。
・上記のサブクラス型の変数にスーパークラス型の変数を代入する。
・OKと出力する。
16‐9
Exer16_08を、サブクラス型の変数に直接スーパークラス型のインスタンスを生成して代入するように変更したExer16_09というクラスを作成し、コンパイルエラーとなることを確認しなさい。
16‐10
上記Car01とTrack02を使用し、次のような処理を行うExer16_10というクラスを作成し、コンパイルエラーとなることを確認しなさい。
・サブクラス型の変数を宣言する。
・スーパークラス型の変数を宣言し、サブクラス型のインスタンスを生成して代入する。
・上記のサブクラス型の変数にスーパークラス型の変数を代入する。
・OKと出力する。
16‐11
Exer16_10は、結果的にサブクラス型の変数の参照先がサブクラス型のインスタンスになるので、コンパイルが成功すれば、正常に実行される可能性が残っています。
コンパイルが通るように修正したExer16_11というクラスを作成・コンパイル・実行しなさい。
(ヒント:キャストを使用しなさい。)
16‐12
Exer16_08をキャストを使用してコンパイルが通るように修正したExer16_12というクラスを作成・コンパイル・実行し、結果を確認しなさい。
16‐13
次のことを確認できるクラスを作成しなさい。
・スーパークラス型の変数がサブクラス型のインスタンスを参照している場合、インスタンスには存在しているにもかかかわらず、サブクラスにしかないフィールドやメソッドは、そのスーパークラス型の変数から使用することができない。(コンパイルエラーとなるクラスを作成しなさい。)
16‐14
次のことを確認できるクラスを作成しなさい。
・スーパークラス型の変数がサブクラス型のインスタンスを参照している場合、その変数からオーバーライドされたメソッドを呼び出せば、変数の型(スーパークラス型)ではなく、インスタンスの型(サブクラス型)のほうが有効である。