【Java】親を超えてゆけ!「オーバーライド」でメソッドを自分流にアレンジする方法
はじめに
みなさんどうも、おげんです。
前回の記事で、extends(継承)を使って「親の機能をまるごと引き継いで楽をする」方法を学びました。
でも、継承を使い始めると、こんな不満が出てきませんか?
- 「親の歩く(walk)メソッドは引き継ぎたいけど、勇者ならもっとカッコよく歩かせたい!」
- 「魔法使いの攻撃(attack)は、剣じゃなくて杖で叩かせたい!」
そう、引き継いだものを「そのまま使う」だけじゃ、どのキャラクターもみんな同じ動きになってしまいます。
せっかく継承したのに、個性が死んでしまってはもったいないですよね。
そこで登場するのが 「オーバーライド(上書き)」 です。
これを使えば、親から譲り受けたメソッドの名前はそのままに、「中身だけを自分のクラス専用に作り直す」ことができるんです。
親の七光りに頼りつつ、自分の色もしっかり出す。
そんな「親を超えてゆく」プログラミング術をマスターしていきましょう!
オーバーライドは「秘伝のレシピの書き換え」だ!
継承(extends)をしただけだと、子クラスは親クラスのメソッドをそのまま実行します。
でも、「基本の型は引き継ぎたいけど、中身だけ自分流にアレンジしたい」という時がありますよね。
これをオーバーライド(上書き)と呼びます。
ベースはあるけど、味付けは変える
「カレー屋」をイメージしてみてください。
- 親クラス(本店): 基本のカレーレシピ(野菜、肉、スパイスA)
- 子クラス(2号店): 本店の看板とレシピを継承する。でも、自分のお店では「スパイスAを激辛スパイスBに変える」。
お客さんから見れば、注文する名前は「カレー(メソッド名)」で同じですが、実際に出てくる味(処理内容)は2号店独自の工夫が凝らされています。
これがオーバーライドの正体です。
要注意!「オーバーロード」と何が違うの?
名前が似すぎていて、全受験生・全新人が混乱するポイントです。
ここでスッキリさせましょう!
| 機能 | 意味 | 場所 | 条件 |
| オーバーロード | 多重定義 | 同じクラス内 | 引数を変えて、名前を使い回す |
| オーバーライド | 上書き | 親子クラス間 | 中身を書き換えて、個性を出す |
オーバーロード(Load)は「荷物を積み増す(引数を増やす)」イメージ。
オーバーライド(Ride)は「上に乗りかかって(上書きして)塗り替える」イメージで覚えるといいですよ!
魔法の言葉「@Override」と書き方のルール
オーバーライドのやり方はとてもシンプルです。
子クラスの中で、親クラスと「全く同じ名前・引数・戻り値」のメソッドを書き直すだけです。
実際のコードで見てみよう
// 親クラス(基本の動き)
public class Human {
public void walk() {
System.out.println("トボトボ歩きます。");
}
}
// 子クラス(自分流にアレンジ!)
public class Hero extends Human {
@Override // ← これが「魔法の言葉」!
public void walk() {
System.out.println("堂々と胸を張って歩きます!");
}
}「@Override」って何のためにあるの?
コードの頭についている @Override。
これはアノテーションと呼ばれるもので、Javaコンパイラに「今から親のメソッドを上書きするよ!」と宣言する合図です。
これをつけておくと、こんな「うっかりミス」を防げます。
- スペルミスを防ぐ: 親は
walkなのに、子がvalkと書き間違えたら「そんなメソッド親にいないよ!」とエラーで教えてくれます。 - 引数の間違いを防ぐ: 引数の数や型を間違えて、意図せず「オーバーロード」になってしまうのを防ぎます。
プロの世界では、これをつけるのが絶対のルール。
バグを防ぐための「最強のお守り」だと思って、必ずセットで書きましょう!
親の機能も捨てがたい! super キーワード
オーバーライドをすると、親のメソッドは完全に上書きされて隠れてしまいます。
でも、プログラミングをしていると「親の処理をそのまま実行しつつ、その後に自分の処理をちょっとだけ足したい」という場面がよくあります。
そんな時に使う合言葉が super(スーパー) です。
「親の力を借りる」魔法の呪文
以下のコードを見てください。
// 親クラス
public class Human {
public void hello() {
System.out.println("こんにちは。");
}
}
// 子クラス
public class PoliteHero extends Human {
@Override
public void hello() {
super.hello(); // ← ここで「親のhello」を呼び出している!
System.out.println("私はこの国の勇者です!");
}
}何が起きているの?
super.hello();「自分を上書きした親(スーパークラス)のhelloを今すぐここで実行して!」という命令です。これで「こんにちは。」が表示されます。- その後の処理 親の処理が終わった後に、自分専用の「私はこの国の勇者です!」が表示されます。
これの何がすごいの?
もし親クラスの挨拶が「おはよう」に変わったとしても、super を使っていれば子クラスを直す必要はありません。
親の良さを活かしながら、自分流のプラスアルファを加える。
これが、無駄のないスマートな書き方なんです。
まとめ:「自分だけのクラス」を完成させよう
今回は、継承したメソッドを自分流に作り直す 「オーバーライド(上書き)」 について学びました。
最後の大事なポイントを振り返りましょう。
- オーバーライドとは: 親から引き継いだメソッドを、子クラスで書き換えて個性を出すこと。
- 成功の秘訣は「同じ形」: メソッド名・引数・戻り値は、親と一字一句同じにする。
@Overrideは必須: 間違いを防ぐ「お守り」として必ずつける。superで親をリスペクト: 親の処理を使いつつ、自分の処理を付け足すこともできる。
「名前を変えない」ことの本当の意味
「名前を変えずに中身を変える」のは、実はすごいことなんです。
使う側からすれば、相手が「人間」でも「勇者」でも「魔法使い」でも、ただ walk() というメソッドを呼ぶだけで、それぞれに最適な動きをしてくれるからです。
呼び出す側がいちいち相手の正体を詳しく知らなくても、正しく動いてくれる。
これを専門用語で 「ポリモーフィズム(多態性)」 と呼びますが、その第一歩がこのオーバーライドなんです。
親から受け継いだものを大切にしながら、あなただけの最高のクラスを作り上げていってくださいね!
今回も最後まで読んでいただき、ありがとうございました!
