Java Silver対策として、抽象クラスに関する問題を解いて理解を深めましょう。
問題
以下のプログラムを実行した場合にコンソールに出力されるのはどれか、正しい選択を一つ選んでください。
abstract class Shape {
abstract void draw();
}
class Circle extends Shape {
void draw() {
System.out.println("Circle");
}
}
class Rectangle extends Shape {
void draw() {
System.out.println("Rectangle");
}
}
public class Main {
public static void main(String[] args) {
Shape shape = new Circle();
shape.draw();
shape = new Rectangle();
shape.draw();
}
}
選択肢
- A. Circle Rectangle
- B. Rectangle Circle
- C. Circle Circle
- D. Rectangle Rectangle
答えと解説
回答を見る
答え
A. Circle Rectangle
解説
まず、Javaにおける抽象クラスについて理解をしておきましょう。
- 基本説明: 抽象クラスは、一つ以上の抽象メソッドを含むクラスで、これらのメソッドは具象クラス(具体的なクラス)でオーバーライドして具体的な動作を定義する必要があります。
今回のコードでは、Shape
が抽象クラスで、そのdraw()
メソッドは具象クラスCircle
とRectangle
でオーバーライドされています。
次に、コードを読み解いていきます。
最初にShape shape = new Circle()
が呼び出されます。
この時点でshape.draw()
の呼び出しにより、オーバーライドされたCircle
クラスのdraw()
が実行されます。
結果として最初の出力は「Circle」になります。
次にshape = new Rectangle()
で、変数shape
がRectangle
のインスタンスを指すようになります。
したがって、もう一度shape.draw()
を呼び出すと、今度はRectangle
のdraw()
が実行されます。
これにより次の出力は「Rectangle」となり、最終的な出力順序は「Circle Rectangle」となります。
- 誤答理由: 抽象クラスを理解していない場合、
Circle
とRectangle
のインスタンス化に伴うメソッドの動作を誤解しやすいです。記述順に注意しましょう。
ローカル変数shape
の参照先が変わることで出力が変化する場合も多いので、実行時にどのクラスのメソッドが呼び出されるのかに注意してください。