広告

手を動かして学ぶ Java入門 (メソッドのオーバーロード)

環境構築不要! ブラウザから直接コードを実行できます。
本記事では、クラス・メソッドのオーバーロードについて学びます。

10分くらいで、さくっと終わる記事をめざしています。


シリーズ一覧

続きは近日公開予定!

はじめに

この記事は paiza.IO の「Online Java compiler」を利用しています。
2024/12/17 現在、上記環境の Java バージョンは 18 です。(paiza.IO利用ガイド)

実行したコードは paiza.IO で保存および公開されることがあります。
そのため、個人情報などの機密性の高い情報は、コードとして入力しないようにご注意ください。

詳細は paiza.IO の利用規約およびプライバシーポリシーをご確認ください。

メソッドのおさらい

メソッド (method) あるいは メンバー関数 (-かんすう, member function) とはオブジェクト指向プログラミング言語において、あるクラスまたはオブジェクトに所属するサブルーチンを指す。

メソッドとは、プログラムの実際の処理をまとめたものです。
例えば、足し算や引き算などの計算をしたり、その結果を画面に出力したり、などなどです。

以前の記事 でも学習しましたね。

次の例では、Human クラスに say メソッドを宣言しています。

public class Human {
    public void say() {
        System.out.println("こんにちは!");
    }
}

say メソッドを呼び出すには次のようにします。

Human human = new Human();
human.say();

Human クラスのインスタンスを new 演算子で生成します。
そして、そのインスタンスに対してメソッドを呼び出します。

通常メソッドの呼び出し図

メソッドのオーバーロード

多重定義 (たじゅうていぎ) あるいは オーバーロード (英: overload) とは、プログラミング言語において同一の名前(シンボル)を持つ関数あるいはメソッドおよび同一の演算子記号について複数定義し、利用時にプログラムの文脈に応じて選択することで複数の動作を行わせる仕組みである。

メソッドのオーバーロードとは、簡単にいうと…

  • 名前は同じだけどパラメータが違うメソッド

のことをいいます。
多重定義とも呼ばれます。

前回学習 したメソッドの オーバーライド とは、名前は似ていますがまったく異なる仕組みです。
よく混同されがちなので注意しましょう。

オーバーライドとは違って、オーバーロードはそんなに難しい概念ではないので、肩の力を抜いて読み進めていただけたらな、と思います。

コード例

具体的な例で見てみましょう。
まずは、オーバーロードしない例です。

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 歳なのですね。

まとめ

メソッドのオーバーロードとは、

  • 名前は同じだけどパラメータが違うメソッド

のことをいいます。

ぜひ有効に活用していきたいですね。

それでは次回もお楽しみに!


関連記事

ページの先頭へ