抽象クラスの罠

抽象クラスの罠

このレッスンでできるようになること。抽象クラスをめぐるコンパイルエラーの条件を整理し、どこで実装が義務になるのかを判定できるようになります。

abstract の付いたクラスは、new でインスタンスを作れません。Shape s = new Shape(); と書いた時点でコンパイルエラーです。ただし Shape s = new Square(3); のように、変数の型として使うことはまったく問題ありません。ここを混同した選択肢がよく並びます。

abstract class Shape { abstract int area(); String describe() { return "area=" + area(); } }

抽象メソッドは本体を持たず、末尾はセミコロンです。中かっこを書くと、たとえ空でもコンパイルエラーになります。

実装が義務になるところ

抽象クラスを継承した具象クラスは、継承したすべての抽象メソッドを実装しなければなりません。1つでも残っていればコンパイルエラーです。逃げ道は2つあります。1つはそのクラス自身も abstract にすること、もう1つは実装を書くことです。抽象クラスが抽象クラスを継承する場合は、途中で実装しなくてもかまいません。

そのほかの条件

抽象クラスもコンストラクタを持てます。自分では new できませんが、子のコンストラクタから super() で呼ばれるからです。フィールドや具象メソッドも自由に持てます。

組み合わせの禁止も出ます。abstractfinal は同時に付けられません。継承されなければ意味がないものと、継承を禁じるものだからです。同じ理由で abstractprivate も、abstractstatic も同時には付けられません。

演習では、抽象メソッドを実装しないと動かない形を実際に埋めます。

要件

  1. SquareShape を継承したままにする
  2. area() を実装し、side の2乗を返す
  3. Shape クラスは変更しない

入出力例

describe(3)"area=9" describe(5)"area=25"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.java
学習モード

メモ

抽象クラスの罠

⌘S で保存