今回も問題を解いてみましょう。
問題
以下のコードを実行した場合、出力結果はどれでしょうか?正しい選択肢を選んでください。
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
オブジェクトは両方のメソッドを持つことができます。
コードでは、myCar
はVehicle
型として宣言されていますが、実際はCar
オブジェクトです。
したがって、start()
メソッドを直接呼び出せます。
またmove()
を使用するには、Movable
型にキャストが必要です。
キャスト後にmove()
メソッドを呼び出すことにより、「Car is moving」と出力されるのです。
よって、出力は「Car started」と「Car is moving」になります。