【おーばーらいど】

オーバーライド とは?

最終更新:
💡 同じ呼び方で、その種類に合う動作へ

継承元などにあるメソッドを、子クラスなどで再定義し、その型に合う動作にすること。例えばJavaでは、インスタンスメソッドの呼び出しが実際のオブジェクトに応じて変わる。

📌 このページのポイント
オーバーライド:種類に合う動作へ親:Animalspeak()子で再定義Dogspeak()ワン!Catspeak()ニャー!同じ呼び方で、実際の種類に合う実装へ
Javaのインスタンスメソッドの例。線は継承関係を示し、呼び出しの順番ではありません。
ひよこ ひよこ
オーバーライドって何?
ペンギン先生 ペンギン先生
例えば動物のspeakというメソッドを、犬では「ワン」、猫では「ニャー」と再定義するよ。親のコード自体を消すのではなく、子の種類に合う動作を用意するんだ。ここではJavaのインスタンスメソッドを例に考えよう。
ひよこ ひよこ
呼ぶ側は、犬か猫かを毎回調べる?
ペンギン先生 ペンギン先生
共通の動物の型を通じて呼べるよ。Javaなら、変数をAnimal型で扱っていても、実際に入っているオブジェクトがDogならDogの再定義したspeakが動く。呼び出し方をそろえ、実際の種類に応じた動作にできるんだ。
ひよこ ひよこ
オーバーロードとは何が違う?
ペンギン先生 ペンギン先生
オーバーライドは継承元のメソッドを再定義すること。オーバーロードはprint(int)とprint(String)のように、引数の型や数などが違う同名メソッドを用意することだよ。Javaでは継承したメソッドと新たに定義したメソッドの組み合わせでもオーバーロードが成立する。
ひよこ ひよこ
Javaの@Overrideは何のため?
ペンギン先生 ペンギン先生
継承元のメソッドを再定義したり、インターフェースのメソッドを実装したりする意図を検査するためだよ。名前や引数を間違えて、該当するメソッドを実装していなければコンパイル時に気付ける。親クラスだけが対象ではないんだ。
ひよこ ひよこ
どんなメソッドでも、上書きできる?
ペンギン先生 ペンギン先生
Javaではfinalのメソッドはオーバーライドできず、finalのクラスは継承できないよ。staticメソッドを子で同じ名前・引数にしても、インスタンスのオーバーライドとは異なる「隠蔽」になる。名前が同じかだけで判断せず、言語の条件を確認しよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「オーバーライド」って出てきたら「受け継いだメソッドを、自分の種類に合う動作へ再定義すること」と思えばだいたいOK!
📖 おまけ:英語の意味
「Override」 = 既存の動作などを上書きすること
💬 元のコードを書き換えるのではなく、継承元の定義に対して別の実装を与えるイメージだよ。成立する条件は言語で確認しよう。

参考資料

← 用語集にもどる