導入
前回はフィールドをあとから設定しました。でもコンストラクタでまとめて初期化したい場合、親クラスのフィールドも一緒に初期化してあげる必要があります。そのための仕組みが 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のコンストラクタを呼び出し、nameとageの初期化を任せています。Dog自身はnameやageのフィールドを持っていませんが、Animalから継承しているので、super()で初期化すればそのまま使えます。
やってみよう
下のエディタを実行し、Dog のコンストラクタが super() 経由で Animal のフィールドを初期化していることを確認しましょう。super(name, age); を消すとどうなるか(name と age が初期化されなくなる)も試してみてください。
演習
Vehicle クラスに String name と int wheels(タイヤの数)を持たせ、コンストラクタで両方を受け取って初期化してください。Car extends Vehicle に String brand を追加し、コンストラクタで name・wheels・brand を受け取り、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 は継承したフィールドなのでそのまま使えます。