メソッドのオーバーライド (@Override)
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 22/87。
メソッドのオーバーライドを使用すると、サブクラスは親クラスですでに定義されているメソッドに対して独自の実装を提供できます。これにより、子クラスは継承された動作を特定のニーズに合わせてカスタマイズできます。
メソッドをオーバーライドすると、そのサブクラスのオブジェクトに対して、サブクラス側のバージョンが親クラスのバージョンを完全に置き換えます。メソッドは、親メソッドと同じ名前とパラメータを持ち、戻り値の型は親メソッドと同じ(またはそのサブタイプ)である必要があります:
public class Animal {
public void makeSound() {
System.out.println("Some generic sound");
}
}
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof!");
}
}
public class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Meow!");
}
}@Overrideアノテーションは、親クラスのメソッドをオーバーライドする意図をコンパイラに伝えます。これは任意ですが、メソッド名を誤って入力したり、間違ったパラメータを使用したりした場合にコンパイラがエラーを検出するため、強く推奨されます:
@Override
public void makeSound() { } // 正解 - コンパイラがこれを検証します
public void makesound() { } // タイポ(打ち間違い)!オーバーライドする代わりに新しいメソッドを作成してしまいますオーバーライドされたメソッドを呼び出すと、Javaは実際のオブジェクト型に属するバージョンを実行します:
Dog dog = new Dog();
dog.makeSound(); // 出力: Woof!
Cat cat = new Cat();
cat.makeSound(); // 出力: Meow!前のレッスンで学んだように、新しいコードと一緒に親の振る舞いも含めたい場合は、オーバーライドされたメソッドの中で super.methodName() を使用できることを思い出してください。
チャレンジ
簡単サブクラスが親クラスのメソッドをオーバーライドして、独自の特化した動作を提供する方法を示す通知システムを構築しましょう。@Override アノテーションが間違いを防ぐのにどのように役立つか、また各サブクラスが継承されたメソッドをどのようにカスタマイズできるかを確認します。
コードを整理するために3つのファイルを作成します:
Notification.java: 汎用的な通知を表す親クラスを作成します。以下の内容を含める必要があります:message(String) のためのプライベートフィールド- メッセージを受け取るコンストラクタ
- メッセージを返すメソッド
getMessage() "Sending notification: " + messageを出力するメソッドsend()
EmailNotification.java: Notification を継承し、メール経由で通知を送信する方法をカスタマイズするサブクラスを作成します:recipientメールアドレス (String) のためのプライベートフィールド- メッセージと受信者の両方を受け取り、親クラスの部分には
super(message)を使用するコンストラクタ @Overrideアノテーションを使用してsend()メソッドをオーバーライドし、"Emailing " + recipient + ": " + getMessage()を出力するようにします
Main.java: オブジェクトの型に応じて、同じメソッド名がどのように異なる動作を生み出すかを示します。メッセージとメールアドレスの2つの入力を受け取ります。同じメッセージを使用して通常の Notification と EmailNotification の両方を作成し、それぞれでsend()を呼び出して異なる出力を確認してください。
入力として、メッセージ (String) と受信者のメールアドレス (String) の2つを受け取ります。
出力には、まず親クラスの send() メソッドからの行、次に EmailNotification でオーバーライドされたバージョンからの行の2行が表示されるはずです。これは、メソッドのオーバーライドによって、サブクラスが継承された動作を独自の実装で置き換えることができることを示しています。
自分で試してみよう
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 入力を読み込む
String message = scanner.nextLine();
String recipient = scanner.nextLine();
// TODO: message を使用して Notification オブジェクトを作成する
// TODO: message と recipient を使用して EmailNotification オブジェクトを作成する
// TODO: Notification オブジェクトの send() を呼び出す
// TODO: EmailNotification オブジェクトの send() を呼び出す
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造