本文へスキップ
BecomeCoder

Javaオブジェクト指向コース · 第3章 継承 ― クラスを拡張する · レッスン8

コンストラクタと super() ― 親の初期化を呼ぶ

ブラウザで完結

導入

前回はフィールドをあとから設定しました。でもコンストラクタでまとめて初期化したい場合、親クラスのフィールドも一緒に初期化してあげる必要があります。そのための仕組みが super() です。

説明

super(...) は、サブクラスのコンストラクタの中で、スーパークラスのコンストラクタを呼び出す ための構文です。コンストラクタの 一番最初の行 に書きます。

public class Main {
    public static void main(String[] args) {
        Dog pochi = new Dog("ポチ", 3);
        pochi.introduce();
    }
}

class Animal {
    String name;
    int age;

    Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    void introduce() {
        System.out.println(name + "(" + age + "歳)");
    }
}

class Dog extends Animal {
    Dog(String name, int age) {
        super(name, age);
    }
}
  • super(name, age);Animal のコンストラクタを呼び出し、nameage の初期化を任せています。Dog 自身は nameage のフィールドを持っていませんが、Animal から継承しているので、super() で初期化すればそのまま使えます。

やってみよう

下のエディタを実行し、Dog のコンストラクタが super() 経由で Animal のフィールドを初期化していることを確認しましょう。super(name, age); を消すとどうなるか(nameage が初期化されなくなる)も試してみてください。

演習

Vehicle クラスに String nameint wheels(タイヤの数)を持たせ、コンストラクタで両方を受け取って初期化してください。Car extends VehicleString brand を追加し、コンストラクタで namewheelsbrand を受け取り、super(name, wheels) で親を初期化してから brand を設定してください。show() メソッドで name + "(" + brand + ")" を表示し、main から new Car("スポーツカー", 4, "アルファ") を作って表示してください。

ヒント1を見る

Car(String name, int wheels, String brand) { super(name, wheels); this.brand = brand; }

ヒント2を見る

show() の中で System.out.println(name + "(" + brand + ")");name は継承したフィールドなのでそのまま使えます。

実際に動かしてみよう

下のエディタにJavaを書いて「実行」を押すと、学習用シミュレータが System.out.println の出力を表示します(本物のJVMではなく、教材の範囲を再現した軽量エンジンです)。クラス・継承・コレクションなども動きます。Scanner で入力を読む例は「標準入力」欄に値を入れてください。本文の例を書き換えて動かしてみましょう(Stream・ラムダ・スレッド・ファイル入出力など一部の機能は対象外です)。

Java — ブラウザ内で実行(学習用シミュレータ)

Javaの教材サブセットを動かす学習用シミュレータを読み込みます(本物のJVMではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。