Javaのオーバーロードについてわかりやすく解説!戻り値の違いではオーバーロードにならない

- システム
エンジニア - Javaのオーバーロードとはどのようなことなのでしょうか。
- プロジェクト
マネージャー - 1つのクラスで同じ名前のメソッドを複数実装することです。
Javaのオーバーロードとは?
Javaのオーバーロードとは、1つのクラスで同じ名前のメソッドを複数実装することです。同じ名前でどうやって区別するのかと言えば、パラメータのフィールドの型や数、並び順の違いで区別します。
以下がJavaのオーバーロードの例です。disp_strが2つありますが、別のメソッドとして扱われ、パラメータの違いにより正しく呼ばれます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class MainClass {
public static void disp_str() {
System.out.println("パラメータがありません");
}
public static void disp_str(String str) {
System.out.println(str);
}
public static void main(String[] args) {
disp_str();
disp_str("文字列を渡しました");
}
}
|
実行すると、以下のように表示されます。
パラメータがありません
文字列を渡しました
戻り値の違いではオーバーロードにならない
Javaのオーバーロードはパラメータの違いで同名メソッドが別扱いになりますが、戻り値の違いだけでは別扱いになりません。以下の場合はコンパイルエラーになります。
戻り値があるメソッドは、それを受け取らないことも可能なので、戻り値の有無や型では判別しきれないからです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public class MainClass {
public static void disp_str(String str) {
System.out.println(str);
}
public static int disp_str(String str) {
System.out.println(str);
return 0;
}
public static void main(String[] args) {
int r = disp_str("文字列を渡しました"); // これは判別できるが
disp_str("もう一度、文字列を渡しました"); // これは判別できない。
}
}
|
フィールドの名前が違うだけでもオーバーロードにならない
以下のようにパラメータのフィールド名が違っていても、型が同じだとやはりエラーになります。これもメソッドを呼び出す時、どちらなのか判別ができないからです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class MainClass {
public static void disp_str(String str1, int val1) {
System.out.println(str1 + val1);
}
public static void disp_str(String str2, int val2) {
System.out.println(str2 + val2);
}
public static void main(String[] args) {
disp_str("文字列を渡しました", 100);
}
}
|
パラメータの順番が違えばオーバーロードはできる
ただし、上に似たケースでも、パラメータの順番を入れ替えればオーバーロードができます。以下のJavaサンプルをご覧ください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class MainClass {
public static void disp_str(String str, int val) {
System.out.println(str + val);
}
public static void disp_str(int val, String str) {
System.out.println(str + val);
}
public static void main(String[] args) {
disp_str("1 文字列を渡しました", 100);
disp_str("2 文字列を渡しました", 200);
}
}
|
これはエラーにならず、実行すると以下のように表示されます。パラメータの順番が違っていれば、呼び出す時に判別がつくということです。
1 文字列を渡しました100
2 文字列を渡しました200
メソッドのパラメータは通常は型変換をしてくれる
以下のようなケースの場合、パラメータにint型の100を指定していますが、disp_valの側ではfloat型の100.0fに変換してくれます。
1
2
3
4
5
6
7
8
9
10
11
12
|
public class MainClass {
public static void disp_val(float val) {
System.out.println("float型の" + val);
}
public static void main(String[] args) {
disp_val(100);
}
}
|
実行結果は以下になります。
float型の100.0
オーバーロードでは型変換をあてにできない
ところが、以下のJavaサンプルのようにint型とfloat型のオーバーロードを行うと、結果は「int型の100」になります。オーバーロードではパラメータの値が型変換されず、その型で呼び出しが切り替わるということです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class MainClass {
public static void disp_val(int val) {
System.out.println("int型の" + val);
}
public static void disp_val(float val) {
System.out.println("float型の" + val);
}
public static void main(String[] args) {
disp_val(100);
}
}
|
パラメータの型を適切に指定する
オーバーロードを使う場合、メソッドを呼び出す時のパラメータの型を適切に指定する必要があるということです。以下のJavaサンプルをご覧ください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
public class MainClass {
public static void disp_val(char val) {
System.out.println("char型の" + val);
}
public static void disp_val(byte val) {
System.out.println("byte型の" + val);
}
public static void disp_val(int val) {
System.out.println("int型の" + val);
}
public static void disp_val(long val) {
System.out.println("long型の" + val);
}
public static void disp_val(float val) {
System.out.println("float型の" + val);
}
public static void disp_val(double val) {
System.out.println("double型の" + val);
}
public static void main(String[] args) {
disp_val('a');
disp_val((byte)100);
disp_val(100);
disp_val(100l);
disp_val(100.0f);
disp_val(100.0d);
}
|
オーバーロードはパラメータの型を明確にする必要がある
上のJavaサンプルはdisp_valメソッドを呼び出す側で型を明確にしているので、正しくオーバーロードの呼び分けができます。結果は以下になります。
char型のa
byte型の100
int型の100
long型の100
float型の100.0
double型の100.0
なおJavaのbyte型は、longのl、floatのf、doubleのdのような接尾語が無いので、(byte)でキャストするか、byte型の変数を渡す必要があります。
- システム
エンジニア - オーバーロードはパラメータの型を明確にする必要があるのですね。
- プロジェクト
マネージャー - パラメータの違いによって処理が変わることを覚えておきましょう。
Javaのオーバーロードを有効活用しよう
Javaのオーバーロードについて解説しましたが、ご理解頂けましたでしょうか。同じメソッド名でパラメータの違いにより処理を変えられるオーバーロードはとても便利なので、是非活用してください。
FEnetJava・Javaコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


Java新着案件New Job
-
官公庁向け業務システム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給39万~44万円東京都千代田区(永田町駅) -
販売管理システム開発/Java/東京都中央区/【WEB面談可】/テレワーク
月給49万~55万円東京都中央区(京橋駅) -
生命保険会社向けシステム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給42万~48万円東京都千代田区(大手町駅) -
社会保険システムのパッケージ開発/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(新橋駅) -
金融機関向けシステム更改/Java/東京都江東区/【WEB面談可】/テレワーク
月給46万~51万円東京都江東区(豊洲駅) -
大手通信会社者向けWebシステム改修/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(品川駅)