オーバーライド規則
オーバーライド規則
このレッスンでできるようになること。あるメソッドが本当にオーバーライドとして成立するのか、それともコンパイルエラーになるのかを条件から判定できるようになります。
オーバーライドは名前が同じなら成立するわけではありません。試験では条件のどれか1つだけをそっと崩した選択肢が並びます。判定する順番を決めておくと迷いません。
見るところは4つ
1つめはシグネチャです。メソッド名と引数の並びが完全に一致していなければ、それはオーバーライドではなくオーバーロードです。引数の型が1つでも違えば別のメソッドとして両方が共存します。
2つめは戻り値です。まったく同じ型か、その型のサブクラスなら許されます。これを共変戻り値と呼びます。親が Animal を返すなら子は Dog を返せます。逆はできません。なお int を long にするような基本データ型の広い型への変更は共変とは認められず、エラーになります。
3つめはアクセス修飾子です。狭めることはできず、同じか広くする分には自由です。protected を public にするのは通り、protected を修飾子なしや private にするのはエラーです。広さの順は狭いほうから private、修飾子なし、protected、public です。
4つめは検査例外です。throws に書ける検査例外は、親が宣言したものと同じかそのサブクラスだけです。親が何も宣言していないメソッドで子が Exception を投げると宣言するとエラーになります。ただし RuntimeException の仲間は非検査例外なので、いくつ足しても問題ありません。
final と static
final の付いたメソッドはオーバーライドできません。static メソッドは子で同じシグネチャを書いても隠蔽になるだけで、動的束縛は起きません。さらに、片方だけ static にすることはできず、その場合はコンパイルエラーになります。
演習では、共変戻り値とアクセス修飾子の拡大を実際に書いて通します。
要件
reproduce()の戻り値の型をDogにするreproduce()のアクセス修飾子をpublicにするAnimalクラスは変更しない
入出力例
check() → "Dog-wan"
check() → "Dog-wan"