【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を使ってオーバーロード元のメソッドを呼ぶ場合留意する。
で、このオーバーライドが出来ると何がどう便利かは、次回へ続く。
この記事が気に入ったらサポートをしてみませんか?