MENU

【Java Silver 試験】参照型のキャストとポリモーフィックなメソッド呼び出し

今回もJavaの基礎を深めるための問題に挑戦しましょう。

問題

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

class Vehicle {
                void start() {
                    System.out.println("Vehicle is starting");
                }
            }
            
            class Car extends Vehicle {
                @Override
                void start() {
                    System.out.println("Car is starting");
                }
            }
            
            class Bike extends Vehicle {
                @Override
                void start() {
                    System.out.println("Bike is starting");
                }
            }
            
            public class Main {
                public static void main(String[] args) {
                    Vehicle myVehicle = getVehicle("car");
                    myVehicle.start();
                }
                
                static Vehicle getVehicle(String type) {
                    if (type.equals("car")) {
                        return new Car();
                    } else {
                        return new Bike();
                    }
                }
            }

選択肢

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

答えと解説

回答を見る

答え

B. Car is starting

解説

解説のポイント:

  • オーバーライドメソッドと動的バインディング
  • if-else条件分岐とリターン値の選択

Javaでは、オブジェクトの型によってどのメソッドが実行されるかが決まります。これはポリモーフィズムという概念によるもので、オブジェクトが実際にどのクラスのインスタンスであるかに応じたメソッドが動的に選ばれます。このため、Vehicle型の変数myVehicleCarのオブジェクトを指すようになり、start()メソッドを呼び出すとCarクラスのオーバーライドされたメソッドが実行され、「Car is starting」と出力されます。

このコード例では、getVehicleという静的メソッドが与えられた文字列に応じて異なるサブクラスのインスタンスを返しています。typeが”car”であればCarインスタンスが、そうでなければBikeのインスタンスが返されます。例ではgetVehicle("car")が呼ばれるため、Carのメソッドが実行されます。

多くの初学者はVehicle型の変数でCarBikeの実際のインスタンスを保持できることに混乱を覚えるかもしれません。しかし、これがJavaの多態性の持つ強力な一面です。このメカニズムを理解することでコードの再利用性と柔軟性が大いに向上します。

目次