抽象クラスとその活用法について考えてみましょう。
問題
以下のプログラムを実行した場合に得られる出力を選びなさい。
abstract class Shape {
abstract void draw();
}
class Circle extends Shape {
void draw() {
System.out.println("Drawing Circle");
}
}
class Square extends Shape {
void draw() {
System.out.println("Drawing Square");
}
}
public class Main {
public static void main(String[] args) {
Shape shape1 = new Circle();
Shape shape2 = new Square();
shape1.draw();
shape2.draw();
}
}
選択肢
- A. Drawing Circle
- B. Drawing Square
- C. Drawing Circle
Drawing Square - D. コンパイルエラー
- E. 実行時エラー
答えと解説
回答を見る
答え
C. Drawing Circle
Drawing Square
解説
今回の問題は抽象クラスの継承に関する基本的な理解が試されています。
- 基本説明
Javaの抽象クラスは、直接インスタンス化できない特殊なクラスで、共通の振る舞いを定義します。ただし、具体的な処理内容はサブクラスで実装させるため、いくつかのメソッドをabstractとして宣言します。
ここでは、Shape
クラスが抽象クラスとして定義され、draw
メソッドが抽象メソッドになっています。このメソッドはCircle
とSquare
によって実装されます。
- 誤答理由
抽象クラス自体からインスタンスを作成できないため、「D. コンパイルエラー」や「E. 実行時エラー」を選んだ方は、Shape
のインスタンスを直接作成しようとしていると誤解した可能性があります。しかし実際には、Circle
とSquare
という具象クラスからインスタンスが作成されているため、正しく動作します。
- つまずきポイント
初心者が特に注意すべき点は、抽象的であるために抽象クラスが何をするためのものかが直感的にわかりにくいことがあります。具体化するために、Shape
を「設計図」として考え、Circle
やSquare
はこの設計図に従い具体的な物体を製作する工場だと理解するとイメージがつきやすいでしょう。
- 発展知識
抽象クラスと似た概念に「インターフェース」があります。大きな違いは、抽象クラスは一部のメソッドに具体的な実装を持つことができるのに対し、インターフェースはすべてのメソッドが抽象メソッドとして定義される点です。また、一つのクラスは複数のインターフェースを実装できる一方、抽象クラスに対しては単一継承しかできないという違いがあります。