手を動かして学ぶ Java入門 (メソッドのオーバーロード)
環境構築不要! ブラウザから直接コードを実行できます。
本記事では、クラス・メソッドのオーバーロードについて学びます。
10分くらいで、さくっと終わる記事をめざしています。
シリーズ一覧
- シリーズ
- 手を動かして学ぶ Java入門 (Hello world 編)
- 手を動かして学ぶ Java入門 (数値と演算)
- 手を動かして学ぶ Java入門 (数値と変数)
- 手を動かして学ぶ Java入門 (コメントの書き方)
- 手を動かして学ぶ Java入門 (文と式の違い)
- 手を動かして学ぶ Java入門 (if文)
- 手を動かして学ぶ Java入門 (if-else文、if-elseif文)
- 手を動かして学ぶ Java入門 (文字列の連結)
- 手を動かして学ぶ Java入門 (while文)
- 手を動かして学ぶ Java入門 (break文)
- 手を動かして学ぶ Java入門 (continue文)
- 手を動かして学ぶ Java入門 (for文)
- 手を動かして学ぶ Java入門 (クラスの超基本)
- 手を動かして学ぶ Java入門 (クラス・メソッド)
- 手を動かして学ぶ Java入門 (クラス・フィールド)
- 手を動かして学ぶ Java入門 (クラス・コンストラクタ)
- 手を動かして学ぶ Java入門 (文字列クラス)
- 手を動かして学ぶ Java入門 (静的メソッド)
- 手を動かして学ぶ Java入門 (静的フィールド)
- 手を動かして学ぶ Java入門 (定数の定義)
- 手を動かして学ぶ Java入門 (クラス継承の超基本)
- 手を動かして学ぶ Java入門 (メソッドのオーバーライド)
- 手を動かして学ぶ Java入門 (メソッドのオーバーロード)
続きは近日公開予定!
はじめに
この記事は paiza.IO の「Online Java compiler」を利用しています。
2024/12/17 現在、上記環境の Java バージョンは 18 です。(paiza.IO利用ガイド)
実行したコードは paiza.IO で保存および公開されることがあります。
そのため、個人情報などの機密性の高い情報は、コードとして入力しないようにご注意ください。
詳細は paiza.IO の利用規約およびプライバシーポリシーをご確認ください。
メソッドのおさらい
メソッドとは、プログラムの実際の処理をまとめたものです。
例えば、足し算や引き算などの計算をしたり、その結果を画面に出力したり、などなどです。
以前の記事 でも学習しましたね。
次の例では、Human クラスに say メソッドを宣言しています。
public class Human {
public void say() {
System.out.println("こんにちは!");
}
}
say メソッドを呼び出すには次のようにします。
Human human = new Human();
human.say();
Human クラスのインスタンスを new 演算子で生成します。
そして、そのインスタンスに対してメソッドを呼び出します。
メソッドのオーバーロード
メソッドのオーバーロードとは、簡単にいうと…
- 名前は同じだけどパラメータが違うメソッド
のことをいいます。
多重定義とも呼ばれます。
前回学習 したメソッドの オーバーライド とは、名前は似ていますがまったく異なる仕組みです。
よく混同されがちなので注意しましょう。
オーバーライドとは違って、オーバーロードはそんなに難しい概念ではないので、肩の力を抜いて読み進めていただけたらな、と思います。
コード例
具体的な例で見てみましょう。
まずは、オーバーロードしない例です。
Human クラスに say メソッドを宣言します。
public class Human {
public void say() {
System.out.println("こんにちは!");
}
public void say() {
System.out.println("良い天気ですね!");
}
}
さて、この Human クラスには say メソッドが2つあります。
この say メソッドを呼び出そうとすると…
Human human = new Human();
human.say();
^^^^^ <--- どちらの say メソッドなのか判断できない
- 1つめの say メソッドを呼び出すべきか?
- 2つめの say メソッドを呼び出すべきか?
…プログラムは判断できません。
というわけで、このプログラムはコンパイルエラーとなります。
実際にプログラムを動かして確認してみましょう。
コードは変更せずに、そのまま「実行(Ctrl-Enter)」ボタンを押してください。
注意:コードは2ファイルあります。上部のタブで切り替え可能です。
(表示がおかしいときは「コードの再読み込み」ボタンを押してみてください)
いかがでしたでしょうか? 下記のようなコンパイルエラーが出たら成功です。
Human.java:6: error: method say() is already defined in class Human
public void say() {
^
1 error
"method say() is already defined in class Human" とは、意訳すると
- say メソッドは Human クラスですでに定義されています。
(よって2つめの say メソッドは定義できません)
という感じです。
次は、オーバーロードする例を見てみましょう。
Human クラスに say メソッドを2つ宣言します。
public class Human {
public void say() {
System.out.println("こんにちは!");
}
public void say(String yourName) {
System.out.println(yourName + "さん、良い天気ですね!");
}
}
しかし、先ほどとは違って2つめの say メソッドには、
- String 型のパラメータを1つ
必要とします。
メソッドを呼び出すときは、パラメータが違うので、プログラムはどちらの say メソッドを呼ぶべきか判断できます。
Human human = new Human();
human.say();
^^^^^ <--- 1つめの say メソッド!
human.say("アリス");
^^^^^^^^^^^^^ <--- 2つめの say メソッド!
よって、コンパイルエラーにはなりません。
実際にプログラムを動かして確認してみましょう。
結果がどうなるか予想してから「実行(Ctrl-Enter)」ボタンを押してください。
注意:コードは2ファイルあります。上部のタブで切り替え可能です。
(表示がおかしいときは「コードの再読み込み」ボタンを押してみてください)
いかがでしたでしょうか? 「出力」のところに
こんにちは!
アリスさん、良い天気ですね!
と表示されたら成功です。
メソッド名はどちらも 同じ です。
しかし、パラメータが違います。
このようなメソッドを宣言することを オーバーロード といいます。
いろいろなパターン
もう少しオーバーロードの例を見てみましょう。
同じ型のパラメータでも、パラメータの 数 が違えばオーバーロードできます。
// オーバーロード OK!
public class Sample1 {
public void test(String s) {
}
public void test(String s1, String s2) {
}
}
パラメータの数が同じでも、パラメータの 型 が違えばオーバーロードできます。
// オーバーロード OK!
public class Sample2 {
public void test(String s) {
}
public void test(int i) {
}
}
これも OK です。
// オーバーロード OK!
public class Sample3 {
public void test(String s, int i) {
}
public void test(int i, String s) {
}
}
ただし、戻り値の型が違うだけでは、オーバーロードできません。
// オーバーロード NG!
public class Sample4 {
public String test() {
return "";
}
public int test() {
return 0;
}
}
応用問題
【問題】
まずは、下記のプログラムをそのまま「実行(Ctrl-Enter)」してみましょう。
結果はコンパイルエラーになったはずです。
Human.java:6: error: method say() is already defined in class Human
public void say() {
^
... 省略 ...
これは Human クラスの say メソッドが正しくオーバーロードされていないためです。
そこで問題です。
Human クラスにある2つの say メソッドに対して、正しいパラメータを書き加えてメソッドを オーバーロード してください。
その結果として、プログラムを実行すると、
はじめまして ボブ!
年齢は 20 歳なのですね。
と「出力」に表示されようにしてください。
それでは、Human クラスの say メソッドにパラメータを書き加えてから「実行(Ctrl-Enter)」してみましょう。
(修正するのは Human クラスだけです)
注意:コードは2ファイルあります。上部のタブで切り替え可能です。
(表示がおかしいときは「コードの再読み込み」ボタンを押してみてください)
無事に、
はじめまして ボブ!
年齢は 20 歳なのですね。
と出力されましたでしょうか?
もし解けなかった場合は、下記の回答例をご参照ください。
回答例
【コード】
public class Human {
public void say(int age) {
System.out.println("年齢は " + age + " 歳なのですね。");
}
public void say(String yourName) {
System.out.println("はじめまして " + yourName + "!");
}
}
※ Main.java は書き換えません。
【出力】
はじめまして ボブ!
年齢は 20 歳なのですね。
まとめ
メソッドのオーバーロードとは、
- 名前は同じだけどパラメータが違うメソッド
のことをいいます。
ぜひ有効に活用していきたいですね。
それでは次回もお楽しみに!
関連記事
- シリーズ
- 手を動かして学ぶ Java入門 (Hello world 編)
- 手を動かして学ぶ Java入門 (数値と演算)
- 手を動かして学ぶ Java入門 (数値と変数)
- 手を動かして学ぶ Java入門 (コメントの書き方)
- 手を動かして学ぶ Java入門 (文と式の違い)
- 手を動かして学ぶ Java入門 (if文)
- 手を動かして学ぶ Java入門 (if-else文、if-elseif文)
- 手を動かして学ぶ Java入門 (文字列の連結)
- 手を動かして学ぶ Java入門 (while文)
- 手を動かして学ぶ Java入門 (break文)
- 手を動かして学ぶ Java入門 (continue文)
- 手を動かして学ぶ Java入門 (for文)
- 手を動かして学ぶ Java入門 (クラスの超基本)
- 手を動かして学ぶ Java入門 (クラス・メソッド)
- 手を動かして学ぶ Java入門 (クラス・フィールド)
- 手を動かして学ぶ Java入門 (クラス・コンストラクタ)
- 手を動かして学ぶ Java入門 (文字列クラス)
- 手を動かして学ぶ Java入門 (静的メソッド)
- 手を動かして学ぶ Java入門 (静的フィールド)
- 手を動かして学ぶ Java入門 (定数の定義)
- 手を動かして学ぶ Java入門 (クラス継承の超基本)
- 手を動かして学ぶ Java入門 (メソッドのオーバーライド)
- 手を動かして学ぶ Java入門 (メソッドのオーバーロード)