Javaでメソッドをオーバーライドするためのルール
Javaでは、メソッドのオーバーライドには一定のルールがあります
- オーバーライドするメソッドは、もとのメソッドと同じメソッド名、引数リスト、戻り値の型を持つ必要があります。
- オーバーライドするメソッドのアクセス修飾子は、オーバーライドされるメソッドのアクセス修飾子より厳しくすることはできません。例えばオーバーライドされるメソッドがpublicの場合、オーバーライドするメソッドはpublic、protected、defaultのいずれかでなければなりませんが、privateにはできません。
- オーバーライドメソッドは、オーバーライド元のメソッドよりも幅広い例外をスローできません。例えば、オーバーライド元のメソッドがException型の例外を宣言している場合は、オーバーライドメソッドはException型の例外のみをスローするか、または例外をスローできません。
- オーバーライドするメソッドには、final、static、private 修飾子を付けることはできません。final 修飾のメソッドはオーバーライドできません。static 修飾のメソッドはクラスのものでインスタンスのものではないため、private 修飾のメソッドはサブクラスからアクセスできないからです。
- オーバーライドメソッドは、オーバーライドされるメソッドのメソッド本体と同じ、またはより具体的な拡張を持つ必要があります。つまり、オーバーライドされたメソッドの実装は、親クラスのメソッドを呼び出して親クラスのロジックを再利用できます。
- サブクラスが親クラスのメソッドをオーバーライドし、サブクラスのオブジェクトがそのメソッドを呼び出した場合、親クラスのメソッドではなく、サブクラスのメソッドが実行されます。この動作を動的メソッドディスパッチと呼びます。