オーバーライド規則

オーバーライド規則

このレッスンでできるようになること。あるメソッドが本当にオーバーライドとして成立するのか、それともコンパイルエラーになるのかを条件から判定できるようになります。

オーバーライドは名前が同じなら成立するわけではありません。試験では条件のどれか1つだけをそっと崩した選択肢が並びます。判定する順番を決めておくと迷いません。

見るところは4つ

1つめはシグネチャです。メソッド名と引数の並びが完全に一致していなければ、それはオーバーライドではなくオーバーロードです。引数の型が1つでも違えば別のメソッドとして両方が共存します。

2つめは戻り値です。まったく同じ型か、その型のサブクラスなら許されます。これを共変戻り値と呼びます。親が Animal を返すなら子は Dog を返せます。逆はできません。なお intlong にするような基本データ型の広い型への変更は共変とは認められず、エラーになります。

3つめはアクセス修飾子です。狭めることはできず、同じか広くする分には自由です。protectedpublic にするのは通り、protected を修飾子なしや private にするのはエラーです。広さの順は狭いほうから private、修飾子なし、protectedpublic です。

4つめは検査例外です。throws に書ける検査例外は、親が宣言したものと同じかそのサブクラスだけです。親が何も宣言していないメソッドで子が Exception を投げると宣言するとエラーになります。ただし RuntimeException の仲間は非検査例外なので、いくつ足しても問題ありません。

final と static

final の付いたメソッドはオーバーライドできません。static メソッドは子で同じシグネチャを書いても隠蔽になるだけで、動的束縛は起きません。さらに、片方だけ static にすることはできず、その場合はコンパイルエラーになります。

演習では、共変戻り値とアクセス修飾子の拡大を実際に書いて通します。

要件

  1. reproduce() の戻り値の型を Dog にする
  2. reproduce() のアクセス修飾子を public にする
  3. Animal クラスは変更しない

入出力例

check()"Dog-wan" check()"Dog-wan"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.java
学習モード

メモ

オーバーライド規則

⌘S で保存