010 メソッドのオーバーロード 005 解答例

public class UserInfo {
    private String name;
    private int age;

    // コンストラクタ
    public UserInfo(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 名前と年齢を含む文字列を返すtoStringメソッド
    public String toString() {
        return "名前: " + name + ", 年齢: " + age;
    }

    // 性別情報を含む文字列を返すtoStringメソッド
    public String toString(String gender) {
        return toString() + ", 性別: " + gender;
    }

    public static void main(String[] args) {
        // 名前と年齢だけを持つユーザー情報
        UserInfo user1 = new UserInfo("Alice", 25);
        System.out.println(user1.toString()); // 出力: 名前: Alice, 年齢: 25

        // 名前、年齢、性別を持つユーザー情報
        UserInfo user2 = new UserInfo("Bob", 30);
        System.out.println(user2.toString("Male")); // 出力: 名前: Bob, 年齢: 30, 性別: Male
    }
}

このコードでは、toString メソッドが引数無しで呼び出された場合、名前と年齢を含む文字列を返します。 一方、toStringが性別を表す引数つきで呼び出された場合、名前と年齢に加えて性別情報も返します。このオーバーロードされたtoString(String gender) メソッド内では、引数を持たない toString() を呼び出すことで、名前と年齢の情報を含む文字列が生成されています。

ポイント:

  1. クラスの構造: UserInfo クラスは、名前(name)と年齢(age)を保持するプライベートなフィールドを持ちます。これらのフィールドはコンストラクタを通じて初期化されます。
  2. コンストラクタ: UserInfo クラスには、名前と年齢を指定してオブジェクトを生成するためのコンストラクタがあります。これはオブジェクトの初期化に使用されます。
  3. toStringメソッド: クラス内には toString メソッドが2つあります。一つは引数を取らないバージョンで、もう一つは性別の情報を引数として受け取ります。toString メソッドはオブジェクトの文字列表現を提供します。
  4. メソッドのオーバーロード: toString メソッドがオーバーロードされています。オーバーロードにより、同じ名前のメソッドが複数のバージョンで存在できます。これらのバージョンは引数の数や型で区別されます。
  5. mainメソッド: main メソッドでは、UserInfo クラスのオブジェクトを作成し、toString メソッドを呼び出して結果を表示しています。これにより、オブジェクトの文字列表現が表示されます。

オーバーロードされたメソッドから同じ名前の別のメソッドを呼び出す

「オーバーロードされたメソッドから同じ名前の別のメソッドを呼び出す」とは、同一のクラス内でメソッド名は同じで引数リストが異なるメソッドが複数存在する場合に、あるオーバーロードされたメソッド内で別の同名メソッドを呼び出すという行為を指します。これにより、コードの再利用性や可読性が向上します。

以下に、簡単な例を示します。ここでは、calculate メソッドがオーバーロードされ、その中で同じクラス内で定義された別の calculate メソッドを呼び出しています。

public class Calculator {
    // オーバーロードされたメソッド1
    public int calculate(int a, int b) {
        int sum = calculate(a, b, 0); // 同名の別のメソッドcalculateを呼び出す
        return sum;
    }

    // オーバーロードされたメソッド2
    public double calculate(double a, double b) {
        double sum = calculate(a, b, 0.0); // 同名の別のメソッドcalculateを呼び出す
        return sum;
    }

    // 同名の別のメソッドcalculate
    private int calculate(int a, int b, int c) {
        return a + b + c;
    }

    // 同名の別のメソッドcalculate
    private double calculate(double a, double b, double c) {
        return a + b + c;
    }

    public static void main(String[] args) {
        Calculator calculator = new Calculator();

        // オーバーロードされたメソッド1を呼び出す
        int result1 = calculator.calculate(5, 3);
        System.out.println("Result 1: " + result1); // 出力: Result 1: 8

        // オーバーロードされたメソッド2を呼び出す
        double result2 = calculator.calculate(5.5, 3.2);
        System.out.println("Result 2: " + result2); // 出力: Result 2: 8.7
    }
}
  • Calculator クラスには、calculate メソッドがオーバーロードされています。
  • オーバーロードされたメソッド内で同名の別の calculate メソッドを呼び出しています。
  • 同名の別のメソッドはそれぞれ整数と倍精度浮動小数点数の加算を行います。
  • main メソッドでは、それぞれのオーバーロードされた calculate メソッドを呼び出して結果を表示しています。これにより、同じ加算ロジックが再利用されています。

「010 メソッドのオーバーロード」問題集リスト