栗悟飯とカメハメ波

秋葉系ニートブログ。

【Java】どこ見ても分かりずらいからオーバーロードとオーバーライドの違いを簡単にまとめる

こんちゃ、Roaです。
今回はオーバーロードとオーバーライドの違いと簡単にそれぞれの特徴を比較しながら分かりやすくまとめました。

サムラ〇エンジニアとかテック〇カデミーだったりのサイトやその他プログラミングブログがあまりにも使えない&分かりにくい情報しか書かないのでもう僕が分かりやすく早見表的な感じでまとめました。

とりあえずこの記事に書かれていることさえ理解すれば今後オーバーロードとオーバーライドに困ることは無いと思います。

対象はある程度はこの二つについては知っているが説明しろと言われたらきついなあぐらいのレベルを想定して書いてます。
ではどうぞ。


オーバーロード:メソッドの多重定義(当てはまるものがJVMによって選択されるんでしたよね)
オーバーライド:メソッドの再定義(上書きと考えるべきです。)

→多重定義が再定義かの違い。何通りかの解決法を用意するのがオーバーロード、上書きするのがオーバーライド。


オーバーロード

  • 名前は同じにすること
  • 引数(下のコードだとカッコの中のdoubleとint)が異なるのが条件(型や順番など)
  • 戻り値(下のコードだとカッコの外のintの部分)は変えない
  • 引数の変数名(下のコードではaとbのこと)は変えない

→変数名を変えないとのことだが変数名を書く場合であり何も書かないのはアリ


以下、Java se11 silverの問題集から抜粋コード。
上の説明を当てはめてみてほしい。

int calc(double a, int b) {
  return (int) a+b;
}


オーバーライド

  • シグニチャ(メソッド名、引数の数、型、順番)が同じことが条件。
  • 戻り値は同じかそのサブクラス型(共変戻り値)
  • アクセス修飾子は同じかより緩いものを指定


以下、Java se11 silver問題集より抜粋

import java.util.Collection;

public class A {
  public void sample(Collection arg) {
    System.out.println("A");
  }
}
import java.util.Collection;
import java.util.List;

public class B extend A {
 
//オーバーライド
 public void sample(Collection arg) {
    System.out.println("B");
  }

//オーバーロード
  public void sample(List arg) {
    System.out.println("C");
  }
}


少し分かりずらい、ぼーっとしているとどちらがオーバーライドでどちらがオーバーロードか分かりませんねこれ笑。

ここでの見分け方は引数の型ですね。

オーバーロードは引数の型が異なるのは任意ではなく条件でしたよね。
対してオーバーライドは引数どころかシグニチャも変えてはいけないという厳格なものでした。


このことを確認して再度このコードを見ると両方紛らわしく書かれていてもどっちがどっちかすぐに分かると思います。


ではでは今回はここらへんで。