メソッドオーバーライディングとは、サブクラスがスーパークラスで定義されたメソッドの独自の実装を提供するOOPのメカニズムです。サブクラスのメソッドは、同様の名前、パラメーター、および戻り値の型(またはそのサブタイプ)を持つ必要があります。
重要なルール:
@Overrideアノテーションの使用は、コンパイル時にエラーを検出するのに役立ちます。例:
class Animal { public void sound() { System.out.println("Some sound"); } } class Dog extends Animal { @Override public void sound() { System.out.println("Woof"); } }
質問: "Javaでstaticメソッドをオーバーライドできますか?"
回答: いいえ、staticメソッドはオーバーライドできません。これは隠蔽(メソッドハイディング)と呼ばれます。サブクラスで同じシグネチャのstaticメソッドを宣言すると、オーバーライドではなく隠蔽が行われます。
例:
class A { static void print() { System.out.println("A"); } } class B extends A { static void print() { System.out.println("B"); } } A obj = new B(); obj.print(); // "A"と表示される
ストーリー
プロジェクトで、ある開発者がサブクラスでstaticメソッドを「オーバーライド」しようとし、スーパークラスの参照からサブクラスのバージョンが呼び出されることを期待しました。これにより、スーパークラスのメソッドが呼び出され、プログラムが正しく動作しない結果となりました。
ストーリー
@Overrideアノテーションを使用することが重要です。あるプロジェクトで、開発者がオーバーライド時にメソッド名に誤りを犯し、アノテーションなしではコンパイラがエラーを出しませんでした。その結果、継承のスキームに基づいて基底クラスのメソッド(デフォルト)が呼び出され、ビジネスプロセスのロジックに誤りが生じました。
ストーリー
checked例外のオーバーライド:開発者がオーバーライドしたメソッドで新しいchecked例外をスローするように追加しましたが、それは元のシグネチャに指定されていませんでした。コードはエラーでコンパイルされ、ルールに違反しているためアーキテクチャを変更する必要がありました。