見出し画像

【Javaお勉強日記】メソッドのオーバーライド

「オーバーロード」と「オーバーライド」

オーバーロードについてはこちらの記事も参照。
【Javaお勉強日記】メソッドとコンストラクタのオーバーロード|yucco|note

まとめると、「同じクラスの中に、同じ名前で引数の構成が違うメソッドを作っておくと、同じ名前だけど微妙に違う仕事をするメソッドを作っておけるよ!」という仕組みがオーバーロード。

例えば、

public int add(int a){
    // 数字を1つだけ渡すと、1を足して返す
    return a + 1
}
public int add(int a, int b){
    // 数字を2つ渡すと、2つの数字を足して返す
    return a + b
}

って感じ。

サブクラス内でのスーパークラスメソッドのオーバーロード

継承についてはこっち。

【Javaお勉強日記】クラスの継承についてまとめる|yucco|note

で、スーパークラスを継承して作ったサブクラスの中から、スーパークラスで作ったメソッドのオーバーロードももちろんできる。
クラス内でやるときと同じようにやればOK。

メソッドのオーバーライド

メソッドのオーバーライドとは、「スーパークラスから継承したメソッドを上書きする」こと。(つまり、自分自身が持っているメソッドのオーバーライドはできない(そもそもやっても意味がないし))

例えば……

class Item {
   int price;
  // コンストラクタ略
   public double getTaxInPrice(){
       // 税込価格として、price×1.1を返す
       System.out.println("Super");
       return price * 1.1;
   }
}
  
class FoodItem extends Item {
   // コンストラクタ略
   @Override
   public double getTaxInPrice(){
       // 食品の場合は、税率を8%にする
       System.out.println("Sub1");
       return price * 1.08;
   }
}

Itemクラスを継承した FoodItem クラスを作って、その中でスーパークラスにあるメソッドと、名前も引数の構成も、戻り値の型もアクセス修飾子も全く同じメソッドを作ることで、スーパークラス内のメソッドを上書きして、別の仕事をさせることができる。

※戻り値の型については、クラス型の場合に限り、元の戻り値型のサブクラス型になら変える事ができる。

※アクセス修飾子は、元のアクセス範囲より広くする場合にのみ、変更ができる(スーパークラスでprivateだったメソッドをpublicにすることはできるが、元々publicだったメソッドをprivateにはできない)

@overrideアノテーションとは​

オーバーライドしたメソッドには@overrideアノテーションを付けることで、コンパイラに「これはスーパークラスのメソッドをオーバーライドしていますからね、オーバーロードじゃないからね、オーバーライド的に正しいかチェックしてね」と伝えることができる。

※こんな風に所々に出てくる「@」のついたごにゃごにゃは、アノテーションと呼び、「コンパイラに何か指示を出すための目印」の役目を果たす。

これ付けておかないと、オーバーライドとしては不適切な書き方(引数の構成が変わってるとか)がしてあっても、コンパイラが「あっオーバーロードだね!」と解釈してコンパイルを通してしまうので、エラー見逃し防止の為にも明示しておく。

オーバーライドした後オーバーロードすると……

オーバーライドとオーバーロードは混在できる。

あるメソッドを、継承先でオーバーライドした上でオーバーロードすると、オーバーライド済みのメソッドをオーバーロードする形になる。thisを使ってオーバーロード元のメソッドを呼ぶ場合留意する。

で、このオーバーライドが出来ると何がどう便利かは、次回へ続く。

この記事が気に入ったらサポートをしてみませんか?