【Java入門】オーバーロードの使い方(オーバーライドとの違いも解説)

こんにちは!フリーランスの長野です。

Javaには同じメソッド名で引数の型や数が違うメソッドを2つ以上定義できるオーバーロードがあります。

この記事では、オーバーロードについて

・オーバーロードとは
・オーバーロードの使い道(使うメリット)
・オーバーライドとの違い
・オーバーロードの使い方

といった基本的な内容から

・引数が継承関係にあるときの優先順位
・コンストラクタのオーバーロード

など応用的な内容についても解説していきます。

今回はオーバーロードについて、使い方をわかりやすく解説します!

オーバーロードとは

オーバーロードとは、同じクラスの中でメソッド名と戻り値の型が同じで、引数の型や数、並び順が違うメソッドを2つ以上定義することをいいます。

オーバーロードの使い道(使うメリット)

同じような処理だけれども、一部を変数にして処理結果をより自由に変えたい場合などで使うと便利です。

オーバーライドとの違い

似たような用語でオーバーライドがあります。

よく間違われるので、簡単に説明しておきます。

オーバーライドは、継承した子クラスで親クラスと同じメソッド名のまま、処理内容を変更して再定義することを言います。

引数の型や数、並び順は親クラスのそれと同じでなければなりません。

今回お伝えしているオーバーロードは、同じクラスの中でメソッド名と戻り値の型が同じで、引数の型や数、並び順が違うメソッドを定義することでした。

間違えないようにしましょう!

ちなみにオーバーライドについてはこちらで詳しく解説していますので、参考にしてください。

【Java入門】オーバーライド(Override)の使い方
更新日 : 2019年6月7日

また、オーバーライドをするときには「@Override」というアノテーションをつけてオーバーライドしていることを明示します。

アノテーションの使い方についてはこちらの記事で詳しく解説しているので、ぜひ確認してください。

【Java入門】アノテーションの使い方と作成する方法
更新日 : 2019年4月16日

オーバーロードの使い方

オーバーロードの使い方についてサンプルコードで確認しましょう。

実行結果:

このサンプルコードでは、同じメソッド名で引数の数が違う2つのメソッドmsgを実行しています。

メソッドを呼び出して引数を指定する際にString型の変数を1つ指定すれば、String型の引数を1つ持つメソッドが呼び出されて実行されています。

また、String型の変数を2つ指定すればString型の引数を2つ持つメソッドが呼び出されて実行されています。

このように、同じメソッド名の中からどのメソッドを呼び出すかは、指定する引数の型や数、順番を元にコンパイラーが判断してくれるようになっています。

オーバーロードができない場合

オーバーロードをするためには決まりごとがあります。

オーバーロードは、引数の型と個数と全く同じでは使えません。

これはメソッド名と引数が全く同じだと、どちらのメソッドを使えばいいのか判断できなくなるためです。

そのため、オーバーロードをするときには必ず引数の「型」と「数」と「並び順」を変えて定義するようにしてください。

注意点として、戻り値の方を変えれば異なるメソッドと判断されるのではないかと思うかもしれませんが、引数が同じ場合には使用できません。

オーバーロードをするときには必ず引数の型と数と並び順を変えるようにしてください。

引数が継承関係にあるときの優先順位

引数の数や順番が同じで、型だけが違う場合に注意しなければならないことがあります。

型に継承関係がある場合は、どのメソッドが呼び出されるか優先順位が決められています。

サンプルコードで確認しましょう。

実行結果:

このサンプルコードでは、Integer型のオブジェクトiをNumber型のオブジェクトnumに格納しています。

IntegerクラスはNumberクラスを継承したクラスなので、このように格納することが可能です。

これをアップキャストといいます。

このような場合も実行結果のとおり、指定する引数の型にあわせてメソッドが呼び出されます。

生成したインスタンスの型ではないので注意しましょう。

なおアップキャストについては、こちらで詳しく解説していますので、ぜひ参考にしてください。

【Java入門】キャスト(型変換)とアップキャスト、ダウンキャスト
更新日 : 2019年5月30日

コンストラクタのオーバーロード

これまではメソッドのオーバーロードについてお伝えしてきました。

コンストラクタでもメソッドと同じようにオーバーロードで定義することが可能です。

サンプルコードで確認しましょう。

実行結果:

このサンプルコードでは、MyClassクラスで引数なしのコンストラクタとString型の引数を1つ持つコンストラクタとString型の引数を2つ持つコンストラクタを定義しています。

MyClassクラスのインスタンスを生成する際に、引数の数によって呼び出されるコンストラクタが違うのがわかります。

まとめ

いかがでしたか?

今回はオーバーロードについて解説しました。

オーバーライドとの違い、引数の優先順位には注意して下さい。

使いこなすことができるように、この記事を何度も参考にして下さいね!

Javaカリキュラム無料公開中!

この記事はJava入門完全攻略ガイド【基礎学習/アプリ開発/仕事獲得】の一部になります。このカリキュラムは、プログラミング入門者が、基礎学習からアプリ開発、さらには仕事獲得まで体系的に学べる内容となっています。

Java学習に必要な情報を一つにまとめていますので効率よくJavaを学ぶことが出来ます。この機会に是非活用していただければと思います。

Java入門からアプリ開発まで未経験者が知っておくべき基礎を総ざらい
更新日 : 2019年5月22日

最短でJavaを習得したい方へ

もし、あなたが、

「難しすぎて学習が全然進まない」
「学習量が膨大でゴールが見えない」
「エラーを解決するのに何日もかかってしまう」

など、プログラミング学習やキャリアに関してお困りであれば、まずは『無料体験レッスン』にお申し込み下さい。

あなたにとって、最適の解決策をご提案させていただきます。

詳しくは下の画像から詳しいサービス内容をご確認ください。

cta_bannar-java1
LINEで送る
Pocket

書いた人

長野 透

長野 透

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
[email protected]

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説