MENU

【Java Silver 試験】抽象クラスとメソッドの理解【学習内容:抽象クラスの作成と継承】

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()メソッドは具象クラスCircleRectangleでオーバーライドされています。

次に、コードを読み解いていきます。

最初にShape shape = new Circle()が呼び出されます。

この時点でshape.draw()の呼び出しにより、オーバーライドされたCircleクラスのdraw()が実行されます。

結果として最初の出力は「Circle」になります。

次にshape = new Rectangle()で、変数shapeRectangleのインスタンスを指すようになります。

したがって、もう一度shape.draw()を呼び出すと、今度はRectangledraw()が実行されます。

これにより次の出力は「Rectangle」となり、最終的な出力順序は「Circle Rectangle」となります。

  • 誤答理由: 抽象クラスを理解していない場合、CircleRectangleのインスタンス化に伴うメソッドの動作を誤解しやすいです。記述順に注意しましょう。

ローカル変数shapeの参照先が変わることで出力が変化する場合も多いので、実行時にどのクラスのメソッドが呼び出されるのかに注意してください。

目次