MENU

【Java Silver】具象クラスの継承とインタフェース、抽象クラスの理解

今回も問題を解いてみましょう。

問題

以下のコードを実行した場合、出力結果はどれでしょうか?正しい選択肢を選んでください。

interface Movable {
    void move();
}

abstract class Vehicle {
    abstract void start();
}

class Car extends Vehicle implements Movable {
    void start() {
        System.out.println("Car started");
    }
    
    public void move() {
        System.out.println("Car is moving");
    }
}

public class Main {
    public static void main(String[] args) {
        Vehicle myCar = new Car();
        myCar.start();
        ((Movable) myCar).move();
    }
}

選択肢

  • A. Car started
  • B. Car is moving
  • C. Car started
    Car is moving
  • D. コンパイルエラー
  • E. 実行時エラー

答えと解説

回答を見る

答え

C. Car started
Car is moving

解説

解説のポイント:

  • インターフェースと抽象クラスの違い
  • キャストの使い方

JavaのインターフェースMovableは、移動機能の契約を提供しています。

一方、抽象クラスVehicleは、スタート機能を抽象メソッドとして提供します。

CarクラスはVehicleを継承し、Movableを実装しています。

これにより、Carオブジェクトは両方のメソッドを持つことができます。

コードでは、myCarVehicle型として宣言されていますが、実際はCarオブジェクトです。

したがって、start()メソッドを直接呼び出せます。

またmove()を使用するには、Movable型にキャストが必要です。

キャスト後にmove()メソッドを呼び出すことにより、「Car is moving」と出力されるのです。

よって、出力は「Car started」と「Car is moving」になります。

目次