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

// 親クラス Vehicle
class Vehicle {
    // インスタンス変数
    private String color;

    // 親クラスのコンストラクタ
    public Vehicle(String color) {
        this.color = color;
    }

    // インスタンス変数のゲッターメソッド
    public String getColor() {
        return color;
    }
}

// 子クラス Car
class Car extends Vehicle {
    // インスタンス変数
    private int speed;

    // 子クラスのコンストラクタ
    public Car(String color, int speed) {
        // 親クラスのコンストラクタを明示的に呼び出す
        super(color);
        this.speed = speed;
    }

    // インスタンス変数のゲッターメソッド
    public int getSpeed() {
        return speed;
    }
}

// メインクラス
public class Main {
    public static void main(String[] args) {
        // Car クラスのインスタンスを作成
        Car myCar = new Car("Blue", 60);

        // インスタンス変数の値を取得して表示
        System.out.println("Car Color: " + myCar.getColor());
        System.out.println("Car Speed: " + myCar.getSpeed());
    }
}

このコードでは、Vehicle クラスが親クラスとして、Car クラスが子クラスとして定義されています。Car クラスのコンストラクタ内で、super(color) を使用して親クラスのコンストラクタを明示的に呼び出しています。これにより、Car クラスは Vehicle クラスのインスタンス変数とメソッドを継承します。

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


Javaでは、サブクラス(子クラス)のコンストラクタが実行される際、暗黙的にスーパークラス(親クラス)のデフォルトコンストラクタが呼び出されます。ただし、もしスーパークラスに引数を持つコンストラクタが定義されている場合、明示的にそのコンストラクタを呼び出す必要があります。

以下に、具体例を挙げながら「明示的なスーパークラスのコンストラクタ呼び出し」について説明します。

// 親クラス
class Vehicle {
    private String color;

    // スーパークラスのコンストラクタ
    public Vehicle(String color) {
        this.color = color;
    }

    public String getColor() {
        return color;
    }
}

// 子クラス
class Car extends Vehicle {
    private int speed;

    // サブクラスのコンストラクタ
    public Car(String color, int speed) {
        // スーパークラスのコンストラクタを明示的に呼び出す
        super(color);
        this.speed = speed;
    }

    public int getSpeed() {
        return speed;
    }
}

// メインクラス
public class Main {
    public static void main(String[] args) {
        // Car クラスのインスタンスを作成
        Car myCar = new Car("Blue", 60);

        // インスタンス変数の値を取得して表示
        System.out.println("Car Color: " + myCar.getColor());
        System.out.println("Car Speed: " + myCar.getSpeed());
    }
}

この例では、Vehicle クラスが親クラスとして、Car クラスが子クラスとして定義されています。Car クラスのコンストラクタ内で super(color) を使用して、Vehicle クラスのコンストラクタを明示的に呼び出しています。これにより、Car クラスは Vehicle クラスのインスタンス変数とメソッドを継承します。

注意点として、super 文はサブクラスのコンストラクタの先頭で呼び出される必要があります。それ以前の位置で呼び出すことはできません。このような明示的な呼び出しは、親クラスのコンストラクタに初期化処理がある場合や、親クラスのデフォルトコンストラクタが存在しない場合に特に重要です。

「014 継承」問題集リスト