MENU

【Java Silver】インタフェースの作成と実装の理解

Javaのインタフェースに関する問題を解いてみましょう。インタフェースとその実装方法について理解を深めます。

問題

次のプログラムを実行した場合の出力はどれでしょうか?正しい選択肢を選んでください。

interface Vehicle {
    void start();
}

class Car implements Vehicle {
    public void start() {
        System.out.println("Car started");
    }
}

class Bike implements Vehicle {
    public void start() {
        System.out.println("Bike started");
    }
}

public class Main {
    public static void main(String[] args) {
        Vehicle vehicle1 = new Car();
        Vehicle vehicle2 = new Bike();
        vehicle1.start();
        vehicle2.start();
    }
}

選択肢

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

答えと解説

回答を見る

答え

B. Car started Bike started

解説

解説のポイント:

  • インタフェースの実装
  • 多態性(ポリモーフィズム)

まず、Vehicleというインタフェースがあります。このインタフェースには、start()というメソッドが定義されています。

CarBikeVehicleインタフェースを実装しており、それぞれstart()メソッドをオーバーライドしています。このように、インタフェースを使うことで異なるクラスに共通のメソッド実装を保証できます。

プログラムの中でVehicle型の変数vehicle1Carオブジェクトが、vehicle2Bikeオブジェクトが格納されています。これにより、それぞれのstart()メソッドがそれぞれのオブジェクトに適した形で実行されます。

この設計により、vehicle1.start()が呼ばれると「Car started」が出力され、vehicle2.start()が呼ばれると「Bike started」が出力され、つまり選択肢Bが正解となります。

基本説明

インタフェースは、クラスがどのようなメソッドを持つべきかを規定する契約書のようなものです。インタフェースを実装することで、そのクラスはインタフェースで定義されたメソッドの実装を提供する必要があります。これは、異なるクラスが共通の動作を持つことを保証するためのJavaの仕組みです。

今回の問題では、Vehicleというインタフェースがあり、これをCarBikeが実装しています。それぞれが独自にstartメソッドを持つため、Vehicle型の変数でも正しい実装が呼ばれます。

誤答理由

選択肢AやCのように同じオブジェクトが二回startされることはありません。B以外を選ぶと、異なるインスタンスを同じものであると誤解している可能性があります。

また、選択肢DとEを選択すると、インタフェースの基本的な実装と多態性の理解に欠けている可能性があります。Javaのコンパイルにおけるポリモーフィズムの特性により、正しく実装されていればコンパイルも実行も正常に動作するはずです。

つまずきポイント

初学者がつまずきがちな点は、インタフェースの実装とそれを利用したポリモーフィズムです。インタフェースは「何をするか」を定義し、それをどのようにするかは実装するクラスに委ねます。この特性を理解するには、具体的なオブジェクトをインタフェース型の変数に入れ、そのメソッドを呼び出す体験が必要です。

最初はオブジェクトの具体的なクラスが何かわかりにくいかもしれませんが、Vehicle vehicle1 = new Car();のように、インタフェース型の変数によってオブジェクトのメソッドを統一的に操作できることを確認すると良いです。

発展知識

インタフェースはJavaの多態性を利用した設計で、大規模なアプリケーションで各部分を疎結合に保つために用いられます。近年ではJava 8から導入されたデフォルトメソッドや静的メソッドによるインターフェースの進化も注目されます。

デフォルトメソッドを使うことで、インタフェース内でも具体的な実装を持たせることが可能になりました。これは、既存のインタフェースを実装するすべてのクラスに影響を与えずに、新しいメソッドを追加したいときに便利です。このように、Javaのインタフェースはただの契約を超えて柔軟な振る舞いを提供するオブジェクト指向設計の重要な要素になっています。

目次