🕌

Javaの「オーバーロード」をざっくりまとめてみた[Java初心者]

に公開

はじめに

こんにちは。
プログラミング初心者Wakinozaと申します。
Java勉強中に調べたことを記事にまとめています。

十分気をつけて執筆していますが、なにぶん初心者が書いた記事なので、理解が浅い点などあるかと思います。
記事を参考にされる方は、初心者の記事であることを念頭において、お読みいただけると幸いです。
間違い等あれば、指摘いただけると助かります。

対象読者

  • Javaを勉強中の方
  • Java Silver試験を勉強中の方
  • Javaの「オーバーロード」についてざっくり知りたい方

目次

1. オーバーロードとは
2. オーバーロードの具体例

本文

1. オーバーロードとは

Javaでは、同名のメソッドを複数定義すると、コンパイラエラーになります。
それは、同名のメソッドが複数あると、JVMが実行時にどのメソッドを呼び出すべきか特定できないためです。

しかし、大規模なプログラムを開発する上で、似たような処理をするメソッドを複数定義したい場合が出てきます。引数が違うだけの同じ処理に1つ1つ別のメソッド変数名を命名するのは煩雑ですし、可読性も低下します。
そんな時に使える技術が、「オーバーロード(多重定義)」です。

「オーバーロード」とは、同じメソッド変数名を複数定義する方法です。
実はJavaは、同一メソッドかどうかを、「メソッド変数名」ではなく「シグネチャ」で判断しています。
「シグネチャ」とは、メソッド宣言のうち、以下の情報をまとめたものです。

  • メソッド変数名
  • 引数の個数
  • 引数のデータ型
  • 引数の並び順

下のコードをご覧ください。

public static String doProcess(int a, String b){
  //any code
}

メソッド宣言の記述のうち、「doProcess(int a, String b)」の部分が「シグネチャ」です。

繰り返しになりますが、Javaはシグネチャでメソッドを判別しているため、同じメソッド変数名でも引数が異なれば、エラーなく共存できます。
引数を変えれば、同じ変数名のメソッドを複数定義するオーバロードが可能になるのです。

オーバーロードを使うと、同じメソッド変数名で複数種類の引数を処理できます。引数だけ違う処理を同じメソッド変数名にまとめることができるため、別々に命名する手間が省け、可読性も向上します。

2. オーバーロードの具体例

シグネチャが異なれば、オーバーロードが可能になると学習しました。
では、具体的にどのような時にオーバーロードが可能なのかを、例をあげて見ていきましょう。

String sayHello(int a, String b){ return "Hello" }

上のsayHelloメソッドをオーバーロードしていきましょう。

String sayHello(){ return "Hello" } //① OK
String sayHello(int a){ return "Hello" } //② OK
String sayHello(int a, String b, int c){ return "Hello" } //③ OK
String sayHello(int a, int b){ return "Hello" } //④ OK
String sayHello(String a, int b){ return "Hello" } //⑤ OK
void sayHello(int a, String b){ } //⑥ 注意:エラー
String sayHello(int c, String d){ return "Hello" } //⑦ 注意:エラー

sayHelloメソッドと同じ変数名のメソッドを7つ定義しました。
このうち、正しくオーバーロードできているのはどれでしょうか?

①②③は、元のメソッドと引数の数が違うため、適切にオーバーロードできています。
④は、引数の数は同じですが、データ型が違うため、適切にオーバーロードできています。
⑤は、引数の数と型は同じですが、引数の順番が異なるため、適切にオーバーロードできています。

⑥は、オーバーロードとは見做されないため、コンパイラエラーとなります。シグネチャは「メソッド変数名と引数の数・型・順」であるため、戻り値は含まれません。戻り値を変えても、シグネチャは元のメソッドと同一のため、エラーとなるのです。
⑦は、オーバーロードとは見做されないため、コンパイラエラーとなります。実は、引数の要素のうち「引数の変数名」は、シグネチャに含まれません。引数の変数名を変えても、シグネチャは元のメソッドと同一となるため、エラーとなるのです。

まとめ

  • Javaは、「シグネチャ」を比べることで、同一メソッドかどうかを判別している
  • 同じ変数名でも、引数の数・型・順番が異なれば、同名のメソッドを複数定義するオーバーロードが可能である

記事は以上です。
最後までお読みいただき、ありがとうございました。

参考情報一覧

この記事は以下の情報を参考にして執筆しました。

  • [オラクル認定資格教科書 JavaプログラマSilverSE11]
  • [スッキリわかるJava入門 第4版]
  • [パーフェクトJava 改訂3版]
  • [7.3 オーバーロードと様々なメソッド呼び出し(可変引数、再帰呼び出し、メソッドチェーンなど)~Java Basic編](最終更新 2023-11-05)(https://qiita.com/KenyaSaitoh/items/42ca1cd16ba35cf2e199) (参照 2025-05-12)
GitHubで編集を提案

Discussion