014 継承(暗黙的なスーパークラスのコンストラクタ呼び出し) 010 解答例

// 車両クラス (Vehicle)
class Vehicle {
    // 車両の色を表すインスタンス変数
    String color;

    // 車両クラスのデフォルトコンストラクタ
    Vehicle() {
        System.out.println("親クラスのデフォルトコンストラクタが呼び出されました。");
    }

    // 車両の色を取得するメソッド
    String getColor() {
        return color;
    }
}

// 自動車クラス (Car) - 車両クラスを継承
class Car extends Vehicle {
    // 自動車の速度を表すインスタンス変数
    int speed;

    // 自動車クラスのコンストラクタ
    Car(String color, int speed) {
        // 親クラスのデフォルトコンストラクタが暗黙的に呼び出される
        this.color = color; // 親クラスのフィールドに値を設定
        this.speed = speed;
    }

    // 自動車の速度を取得するメソッド
    int getSpeed() {
        return speed;
    }
}

// メインクラス
public class Main {
    public static void main(String[] args) {
        // 自動車クラスのインスタンス生成
        Car car = new Car("Blue", 60);

        // メソッドの呼び出しと結果の表示
        System.out.println("Car Color: " + car.getColor());
        System.out.println("Car Speed: " + car.getSpeed());
    }
}

この例では、Car クラスのコンストラクタが呼び出される際に、親クラス Vehicle のデフォルトコンストラクタが暗黙的に呼び出されています。

実行結果:

親クラスのデフォルトコンストラクタが呼び出されました。
Car Color: Blue
Car Speed: 60

この出力からわかるように、Car クラスのコンストラクタが呼び出された際に、親クラス Vehicle のデフォルトコンストラクタが暗黙的に呼び出されています。

暗黙的なスーパークラスのコンストラクタ呼び出し

Javaにおいて、サブクラスのコンストラクタが実行される際、暗黙的にスーパークラスのデフォルトコンストラクタが呼び出されるという仕組みがあります。ただし、スーパークラスには明示的に定義されたコンストラクタが存在する場合、デフォルトコンストラクタは自動的に生成されません。その場合、サブクラスのコンストラクタ内で super() を用いて明示的にスーパークラスのコンストラクタを呼び出す必要があります。

以下はその仕組みの簡単な解説です。

  1. デフォルトコンストラクタ:
    • クラスにコンストラクタが定義されていない場合、Javaはデフォルトコンストラクタ(引数を取らないコンストラクタ)を暗黙的に生成します。
  2. サブクラスのコンストラクタ:
    • サブクラスのコンストラクタが呼び出されると、最初にスーパークラスのコンストラクタが暗黙的に呼び出されます。このスーパークラスのコンストラクタ呼び出しは、super() を用いて行われます。
    • もしスーパークラスに引数を取るコンストラクタがある場合、super(引数) の形で明示的に呼び出す必要があります。

例として、以下のコードを見てみましょう:

class Vehicle {
    String color;

    // スーパークラスのコンストラクタ
    Vehicle(String color) {
        this.color = color;
        System.out.println("Vehicleのコンストラクタが呼ばれました。");
    }
}

class Car extends Vehicle {
    int speed;

    // サブクラスのコンストラクタ
    Car(String color, int speed) {
        // スーパークラスのコンストラクタが暗黙的に呼ばれる
        super(color);
        this.speed = speed;
        System.out.println("Carのコンストラクタが呼ばれました。");
    }
}

public class Main {
    public static void main(String[] args) {
        Car car = new Car("Blue", 60);
    }
}

この例では、Car クラスのコンストラクタが呼び出されると、super(color) によって Vehicle クラスのコンストラクタが暗黙的に呼び出され、その後に Car クラスのコンストラクタが実行されます。

「014 継承」問題集リスト