Menu
Coddy logo textTech

メソッドのオーバーライド (@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()を使用できます。

challenge icon

チャレンジ

簡単

サブクラスが 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 します。
    • recipient email address 用の private field(String)
    • message と recipient の両方を受け取り、parent 部分には super(message) を使用する constructor
    • @Override annotation を使用して 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 を独自の実装に置き換えられることを示しています。

REQUIRED OUTPUT FORMAT: [Your translated content here]

自分で試してみよう

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
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Javaオンラインコンパイラ