抽象クラスの罠
抽象クラスの罠
このレッスンでできるようになること。抽象クラスをめぐるコンパイルエラーの条件を整理し、どこで実装が義務になるのかを判定できるようになります。
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() で呼ばれるからです。フィールドや具象メソッドも自由に持てます。
組み合わせの禁止も出ます。abstract と final は同時に付けられません。継承されなければ意味がないものと、継承を禁じるものだからです。同じ理由で abstract と private も、abstract と static も同時には付けられません。
演習では、抽象メソッドを実装しないと動かない形を実際に埋めます。
要件
SquareはShapeを継承したままにするarea()を実装し、sideの2乗を返すShapeクラスは変更しない
入出力例
describe(3) → "area=9"
describe(5) → "area=25"ヒント
編集 LuaGate編集部