super キーワード
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 21/87。
superキーワードは、サブクラスがその親クラスを参照する方法を提供します。これは、子クラス内から親クラスのメンバやコンストラクタにアクセスする必要がある場合に不可欠です。
super の最も一般的な使い方は、親クラスのコンストラクタを呼び出すことです。これはサブクラスのコンストラクタにおける最初の文でなければなりません:
public class Vehicle {
private String brand;
public Vehicle(String brand) {
this.brand = brand;
}
public String getBrand() {
return brand;
}
}
public class Car extends Vehicle {
private int doors;
public Car(String brand, int doors) {
super(brand); // 最初の行である必要があります
this.doors = doors;
}
}また、super を使用して親クラスのメソッドを呼び出すこともできます。これは、サブクラスに同じ名前のメソッドがある場合に特に便利です。
public class Animal {
public void makeSound() {
System.out.println("Some sound");
}
}
public class Cat extends Animal {
public void makeSound() {
super.makeSound(); // Animalのバージョンを呼び出します
System.out.println("Meow!");
}
}super を this の反対のものと考えてください。this が現在のオブジェクトを指すのに対し、super はそのオブジェクトの親クラスの部分を指します。この区別は、子クラスが親の振る舞いを完全に置き換えるのではなく、拡張する必要があるクラス階層を構築する際に非常に重要になります。
チャレンジ
簡単子クラスが super を使用して親クラスのコンストラクタを呼び出し、親クラスのメソッドの振る舞いを拡張する方法を示す電化製品システムを構築しましょう。
コードを整理するために、3つのファイルを作成します:
Appliance.java: あらゆる家電製品を表す親クラスを作成します。以下の内容を含める必要があります:- 電化製品の
brand(String) 用のプライベートフィールド wattage(int) 用のプライベートフィールド- 両方の値を受け取り、それらを初期化するコンストラクタ
- ブランドを返すメソッド
getBrand() - ワット数を返すメソッド
getWattage() [brand] - [wattage]Wを返すメソッドgetInfo()
- 電化製品の
WashingMachine.java: Appliance を継承するサブクラスを作成します。洗濯機は電化製品が持つすべての機能に加えて、独自の特別な機能を持ちます:- 積載容量(kg)を表す
capacity(int) 用のプライベートフィールド - ブランド、ワット数、容量を受け取るコンストラクタ。
super(brand, wattage)を使用して親クラスの部分を初期化し、その後に容量を設定します。 - 容量を返すメソッド
getCapacity() super.getInfo()を使用して親のgetInfo()を呼び出し、それを拡張して[parent info], Capacity: [capacity]kgを返すメソッドgetInfo()
- 積載容量(kg)を表す
Main.java: WashingMachine を作成し、その完全な情報を表示します。ブランド (String)、ワット数 (int)、容量 (int) の3つの入力を受け取ります。洗濯機のgetInfo()を呼び出した結果を出力してください。
ブランド名、ワット数、容量の3つの入力を受け取ります。
ここで super が2つの目的を果たしていることに注目してください。継承されたフィールドを初期化するために親のコンストラクタを呼び出すことと、親のメソッドを完全に置き換えるのではなく、その振る舞いを利用して構築するために親のメソッドを呼び出すことです。
チートシート
super キーワードは、サブクラス内から親クラスを参照します。
親コンストラクタを呼び出すには super() を使用します。これはサブクラスのコンストラクタにおける最初のステートメントである必要があります:
public class Vehicle {
private String brand;
public Vehicle(String brand) {
this.brand = brand;
}
}
public class Car extends Vehicle {
private int doors;
public Car(String brand, int doors) {
super(brand); // 最初の行である必要があります
this.doors = doors;
}
}親メソッドを呼び出すには super.methodName() を使用します。これは、サブクラスがメソッドをオーバーライドする場合に便利です:
public class Animal {
public void makeSound() {
System.out.println("Some sound");
}
}
public class Cat extends Animal {
public void makeSound() {
super.makeSound(); // Animal のバージョンを呼び出します
System.out.println("Meow!");
}
}super はオブジェクトの親クラス部分を指し、this は現在のオブジェクトを指します。
自分で試してみよう
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 入力を読み込む
String brand = scanner.nextLine();
int wattage = scanner.nextInt();
int capacity = scanner.nextInt();
// TODO: 入力値を使用して WashingMachine オブジェクトを作成する
// TODO: 洗濯機オブジェクトで getInfo() を呼び出した結果を出力する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造