メソッドのオーバーライド (@Override)
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 22/87。
Method overriding により、サブクラスは parent class にすでに定義されている method の独自の実装を提供できます。これは、子クラスが継承した behavior を固有のニーズに合わせてカスタマイズする方法です。
methodをOverrideすると、そのサブクラスのobjectに対しては、サブクラス版がparentの版を完全に置き換えます。methodにはparentのmethodと同じ名前とパラメータが必要で、戻り値の型はparentのものと同じ(またはそのサブタイプ)でなければなりません。
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 annotation は、parent method を overriding する意図を compiler に伝えます。省略可能ですが、誤って method name のスペルを間違えたり、誤ったパラメーターを使用したりした場合に compiler がエラーを検出してくれるため、強く推奨されます。
@Override
public void makeSound() { } // 正しい - コンパイラがこれを検証する
public void makesound() { } // タイプミス!オーバーライドする代わりに新しいメソッドを作成するオーバーライドされたmethodをcallすると、Javaは実際のobjectの型に属するバージョンを実行します。
Dog dog = new Dog();
dog.makeSound(); // 出力: Woof!
Cat cat = new Cat();
cat.makeSound(); // 出力: Meow!前のレッスンで学んだように、新しいコードとともにparentのbehaviorも含めたい場合は、オーバーライドされたmethodの内部でsuper.methodName()を使用できます。
チャレンジ
簡単サブクラスが parent の method を overriding して独自の特化した behavior を提供する仕組みを示す notification system を構築しましょう。@Override annotation がミスの発見にどのように役立つか、また各サブクラスが継承した method をどのようにカスタマイズできるかを確認します。
コードを整理するために、3つのファイルを作成します。
Notification.java:generic notification を表す parent class を Create します。次の要素を持たせます。message用の private field(String)- message を accepts する constructor
- message を返す
getMessage()method Sending notification: [message]を print するsend()method
EmailNotification.java:Notification を extends し、notification の email による送信方法をカスタマイズするサブクラスを Create します。recipientemail address 用の private field(String)- message と recipient の両方を受け取り、parent 部分には
super(message)を使用する constructor @Overrideannotation を使用してsend()method を Override し、Emailing [recipient]: [message]を print する
Main.java:同じ method name が object type に応じて異なる behavior を生み出す仕組みを示します。message と email address の2つの inputs を受け取ります。同じ message を持つ通常の Notification と EmailNotification の両方を Create し、それぞれに対してsend()を call して異なる Output を確認します。
2つの inputs、つまり message(String)と recipient email address(String)を受け取ります。
Output には2行を表示します。最初は parent の send() method から、次に EmailNotification で overriding されたバージョンからの行です。これは、method overriding によってサブクラスが継承した behavior を独自の実装に置き換えられることを示しています。
自分で試してみよう
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: Create a Notification object with the message
// TODO: Create an EmailNotification object with the message and recipient
// TODO: Call send() on the Notification object
// TODO: Call send() on the EmailNotification object
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造自分で練習してみよう: Javaオンラインコンパイラ