Javaのオーバーライド完全解説!初心者向けの基礎知識と正しいルール
生徒
「オーバーライドって具体的にどういうルールがありますか?」
先生
「オーバーライドは、スーパークラスのメソッドをサブクラスで再定義することです。引数の型や順番などいくつかの重要なルールがあります。詳しく見ていきましょう!」
1. オーバーライドとは?
Javaのオーバーライドとは、スーパークラス(親クラス)に定義されたメソッドをサブクラスで再定義することを指します。オーバーライドは、親クラスのメソッドをサブクラスでより具体的な処理に置き換えたいときに使用されます。
オーバーライドには次の重要なルールがあります:
- メソッド名はスーパークラスと同じでなければならない。
- 引数リスト(型、数、順番)がスーパークラスと完全に一致している必要がある。
- 戻り値の型はスーパークラスと同じか、サブクラスである必要がある(共変戻り値)。
- アクセス修飾子は、スーパークラスのメソッドと同じか、より広い範囲(例:protected → public)にする必要がある。
@Overrideアノテーションを付けて、コンパイル時にオーバーライドの正確性をチェックするのが推奨されます。
2. 基本的なオーバーライドの例
次のコードは、基本的なオーバーライドの例です:
class Parent {
public void greet() {
System.out.println("Hello from Parent!");
}
}
class Child extends Parent {
@Override
public void greet() {
System.out.println("Hello from Child!");
}
}
public class Main {
public static void main(String[] args) {
Parent obj = new Child();
obj.greet(); // 出力: Hello from Child!
}
}
このコードでは、ParentクラスのgreetメソッドがChildクラスでオーバーライドされています。実行時にはChildクラスのgreetメソッドが呼び出され、「Hello from Child!」と出力されます。
3. 共変戻り値の例
オーバーライドでは、戻り値の型が親クラスの型と完全に同じである必要はありません。戻り値の型が親クラスの型のサブクラスであれば許容されます。これを共変戻り値と呼びます。
class Animal {
public Animal speak() {
System.out.println("Animal sound");
return new Animal();
}
}
class Dog extends Animal {
@Override
public Dog speak() {
System.out.println("Woof Woof!");
return new Dog();
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
myDog.speak(); // 出力: Woof Woof!
}
}
このコードでは、親クラスAnimalの戻り値型がAnimalであるのに対し、サブクラスDogは戻り値型にDogを指定しています。これは共変戻り値として正しくオーバーライドされています。
4. アクセス修飾子とオーバーライド
オーバーライドでは、アクセス修飾子のルールも重要です。オーバーライドするメソッドのアクセス修飾子は、スーパークラスのメソッドよりも広い範囲にする必要があります。
class Parent {
protected void display() {
System.out.println("Protected method in Parent.");
}
}
class Child extends Parent {
@Override
public void display() {
System.out.println("Public method in Child.");
}
}
public class Main {
public static void main(String[] args) {
Parent obj = new Child();
obj.display(); // 出力: Public method in Child.
}
}
このコードでは、親クラスのdisplayメソッドがprotected修飾子を持つのに対し、サブクラスのdisplayメソッドはpublic修飾子を持っています。これは正しいオーバーライドです。
5. 試験対策ポイント
- オーバーライドでは、引数リスト(型、数、順番)がスーパークラスと同じでなければならない。
- 戻り値型は同じ型か、共変戻り値を使用できる。
- アクセス修飾子は、スーパークラスのメソッドより広い範囲にする必要がある。
@Overrideアノテーションを使用して、コンパイル時に正確性をチェックする。
6. まとめ
オーバーライドは、Javaでオブジェクト指向プログラミングを実践する上で欠かせない技術です。親クラスで定義されたメソッドを、サブクラスで再定義することで、柔軟で再利用性の高いコードを実現できます。今回解説したように、引数リストや戻り値型、アクセス修飾子のルールを正確に理解することが、正しいオーバーライドを行う鍵となります。また、@Overrideアノテーションを活用することで、間違いを未然に防ぐことも重要です。
さらに、共変戻り値を活用すると、親クラスとサブクラスの設計をより効果的に行うことができます。試験対策としても、今回のポイントをしっかりと復習し、実践に活かしてみてください。
生徒
「オーバーライドのルールを詳しく理解できました!共変戻り値って便利なんですね。」
先生
「そうです。特に、親クラスとサブクラスの設計が複雑になるほど、共変戻り値はコードの柔軟性を高めてくれます。」
生徒
「あと、アクセス修飾子のルールも勉強になりました。親クラスより狭い範囲にできないんですね。」
先生
「その通りです。このルールを覚えておけば、コンパイルエラーを未然に防げますよ。どんどん実践してみてください!」