【おーばーらいど】

オーバーライド とは?

💡 親クラスのメソッドを子クラスで「書き換える」継承の活用
📌 このページのポイント
オーバーライド — メソッドの上書き 親クラス: Animal speak() → "..."(デフォルト) 継承 継承 子クラス: Dog speak() ← 上書き! → "ワンワン!" 子クラス: Cat speak() ← 上書き! → "ニャー!" 同じメソッド名でも、子クラスごとに異なる振る舞いを定義できる
オーバーライド(メソッド上書き)のイメージ
ひよこ ひよこ

オーバーライドって何?

ペンギン先生 ペンギン先生

親クラスのメソッドを子クラスで「上書き」して、違う動作にすること。例えば「動物クラス」の「鳴く()」メソッドを、「犬クラス」では「ワン!」、「猫クラス」では「ニャー!」と上書きする。

ひよこ ひよこ

なんでそんな機能があるの?

ペンギン先生 ペンギン先生

「同じメソッド名で呼んでも、オブジェクトの種類に応じて動作が変わる」(ポリモーフィズム)を実現するため。コードを呼ぶ側が「動物.鳴く()」と書けば、実際に犬でも猫でも適切な動作をしてくれる。

ひよこ ひよこ

オーバーロードとは何が違うの?

ペンギン先生 ペンギン先生

オーバーライドは「継承して上書き(親と同じ名前・引数)」、オーバーロードは「同じクラスで引数だけ変えて同名のメソッドを複数定義」。例えばprint(int)とprint(String)を定義するのがオーバーロード。全く別の概念だよ。

ひよこ ひよこ

Javaの@Overrideアノテーションって何のためにあるの?

ペンギン先生 ペンギン先生

「このメソッドは親クラスのメソッドをオーバーライドしています」とコンパイラに明示するためだよ。もし親クラスにそのメソッドがなかったらコンパイルエラーになるから、メソッド名のスペルミスに気づけるんだ。付けなくても動くけど、付けるのがベストプラクティスだよ。

ひよこ ひよこ

オーバーライドを禁止することもできるの?

ペンギン先生 ペンギン先生

できるよ。Javaではfinal修飾子をメソッドに付けるとオーバーライドできなくなる。クラスにfinalを付けると継承自体が禁止される。セキュリティ上重要な処理や、動作を変えられると困るメソッドに使う。実はStringクラスもfinalで継承できない設計になっているんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
オーバーライドって出てきたら「親クラスのメソッドを子クラスで上書き再定義すること」と思えばOK!
📖 おまけ:英語の意味
「Override」 = 上書きする・取り消す
💬 「既存の定義を上書き(over-ride)」するイメージ。ポリモーフィズム(多態性)を実現するための主要な手段
← 用語集にもどる