メソッドオーバーロードの基本
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 28/87。
ポリモーフィズムとは「多くの形態」を意味します。Javaにおいて、それはオブジェクトがコンテキストに基づいて異なる動作をすることを可能にします。ポリモーフィズムの一つの形式はメソッドオーバーロードであり、Javaはコンパイル中にどのメソッドを呼び出すかを決定するため、コンパイル時ポリモーフィズムとも呼ばれます。
メソッドのオーバーロードを使用すると、同じ名前で異なるパラメータを持つ複数のメソッドを定義できます。コンパイラは、パラメータの数、型、または順序に基づいてそれらを区別します:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
public double add(double a, double b) {
return a + b;
}
}add(5, 3)を呼び出すと、Javaは最初のメソッドを使用します。add(5, 3, 2)を呼び出すと2番目のメソッドが実行され、add(5.0, 3.0)を呼び出すと3番目のメソッドが呼び出されます。コンパイラは、渡された引数に基づいて適切なバージョンを選択します。
戻り値の型だけを変更することは、有効なオーバーロードではありません。パラメータリストが異なっている必要があります:
// 有効なオーバーロードではありません - コンパイルされません
public int getValue() { return 1; }
public double getValue() { return 1.0; } // エラー!コンストラクタのオーバーロードで、すでにオーバーロードについては目にしています。メソッドのオーバーロードも同じルールに従い、1つのメソッド名で異なる入力シナリオを処理できるようにすることで、柔軟性を提供します。
チャレンジ
簡単メッセージをフォーマットするための複数の方法を提供することで、メソッドのオーバーロードを実証するメッセージフォーマッタを作成しましょう。異なる入力シナリオを処理する、いくつかのオーバーロードされた format メソッドを持つユーティリティクラスを作成します。
コードを2つのファイルに分けて構成します:
MessageFormatter.java: オーバーロードされたメソッドを通じて柔軟なメッセージフォーマットを提供するクラスを作成します。フォーマッタには以下のメソッドが必要です:- メッセージをブラケットで囲んで返すメソッド
format(String message):[message] - メッセージを指定された回数だけ繰り返し、スペースで区切って返すメソッド
format(String message, int repeatCount) - プレフィックスを付けたメッセージを返すメソッド
format(String message, String prefix):prefix: message - 次のように返すメソッド
format(String message, String prefix, String suffix):prefix: message (suffix)
- メッセージをブラケットで囲んで返すメソッド
Main.java: 4つのオーバーロードされたメソッドがすべて連携して動作することを実証します。メッセージ (String)、繰り返し回数 (int)、プレフィックス (String)、サフィックス (String) の4つの入力を受け取ります。MessageFormatter を作成し、formatメソッドの各バージョンを呼び出し、各結果を個別の行に出力します:- 1つ目は、メッセージのみでフォーマットします
- 2つ目は、メッセージと繰り返し回数でフォーマットします
- 3つ目は、メッセージとプレフィックスでフォーマットします
- 4つ目は、メッセージ、プレフィックス、サフィックスでフォーマットします
メッセージテキスト、繰り返す回数、プレフィックス文字列、サフィックス文字列の4つの入力を受け取ります。
例えば、メッセージが "Hello"、繰り返し回数が 3、プレフィックスが "INFO"、サフィックスが "done" の場合、出力には、それぞれ異なるオーバーロードされたメソッドを使用した、同じメッセージの4つの異なるフォーマット済みバージョンが表示されるはずです!
チートシート
メソッドのオーバーロードを使用すると、同じ名前で異なる引数(パラメータ)を持つ複数のメソッドを定義できます。Javaはコンパイル時に呼び出すメソッドを決定するため、これはコンパイル時ポリモーフィズムとも呼ばれます。
コンパイラは、引数の数、型、または順序に基づいて、オーバーロードされたメソッドを区別します。
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
public double add(double a, double b) {
return a + b;
}
}add(5, 3)を呼び出すと、Javaは最初のメソッドを使用します。add(5, 3, 2)を呼び出すと2番目のメソッドが実行され、add(5.0, 3.0)を呼び出すと3番目のメソッドが呼び出されます。
重要: 戻り値の型だけを変更することは、有効なオーバーロードではありません。引数のリストが異なっている必要があります。
// 有効なオーバーロードではありません
public int getValue() { return 1; }
public double getValue() { return 1.0; } // エラー!自分で試してみよう
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 入力を読み込む
String message = scanner.nextLine();
int repeatCount = Integer.parseInt(scanner.nextLine());
String prefix = scanner.nextLine();
String suffix = scanner.nextLine();
// TODO: MessageFormatter オブジェクトを作成する
// TODO: message のみを使用して format を呼び出し、結果を出力する
// TODO: message と repeatCount を使用して format を呼び出し、結果を出力する
// TODO: message と prefix を使用して format を呼び出し、結果を出力する
// TODO: message、prefix、および suffix を使用して format を呼び出し、結果を出力する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造