[PR] 迷惑メール トップページプロ3ゼミJavaJava入門講座二学期単位7 →2時間目

2時間目 オーバーロード

7−2−1.オーバーロードとは

 メソッドには、オーバーロードと言う仕組みがあります。
オーバーロードとは、メソッド名が同じでも引数の数又は型が違えばメソッドを宣言できる仕組みです。
例えば、次の2つが宣言されていると仮定します。
public int getValue();
と
public int getValue(boolean flag);
です。
アクセスを以下のようにしたとしましょう。
int value = obj.getValue();
value = obj.getValue(true);
そうすると、「obj.getValue()」は、引数が無しの為、「getValue()」が呼ばれ、「obj.getValue(true)」は 「getValue(boolean)」が呼ばれます。
よって、引数の型の違いでメソッドを区別している事が分かります。

7−2−2.オーバーロードの仕組みを使ってプログラムを動かそう

以下のSample7_2_1.javaをご覧下さい!

Sample7_2_1.java
// テスト用計算機
class TestCal {

    // 引数が空、1を返す
    public int add() {

        System.out.print("add()");

        return 1;
    }

    // 引数が1つでint型、データに1を足して返す
    public int add(int data) {

        System.out.print("add(int)");

        return data + 1;
    }

    // 引数が1つでdouble型、データに0.5を足して返す
    public int add(double data) {

        System.out.print("add(double)");

        return (int) (data + 0.5);
    }

    // 引数が2つでint型及びint型、データ1にデータ2を足して返す
    public int add(int data1, int data2) {

        System.out.print("add(int, int)");

        return data1 + data1;
    }

    // 引数が2つでint型及びdouble型、データ1にデータ2を足して返す
    public int add(int data1, double data2) {

        System.out.print("add(int, double)");

        return data1 + (int) data2;
    }

}

public class Sample7_2_1 {

    public static void main(String[] args) {

        TestCal obj = new TestCal();

        System.out.println(":" + obj.add());
        System.out.println(":" + obj.add(10));
        System.out.println(":" + obj.add(10.0));
        System.out.println(":" + obj.add(10, 10));
        System.out.println(":" + obj.add(10, 10.0));
    }
}
  
add():1
add(int):11
add(double):10
add(int, int):20
add(int, double):20

 テスト用に作成した計算機の為、add意味がおかしいですがオーバーロードのサンプルとしては最適です。
指定された引数の型によってメソッドを区別している為、引数の値が「10」なら「obj.add(int)」が呼び出さ れます。
「10」は、double型にも代入できるのですが、あくまでプログラム側がdouble型に変換してくれているだけな ので、int型及びdouble型が合った場合は、int型を持つメソッドにアクセスします。
int型及びdouble型の両方がある場合は、「obj.add(double)」にアクセスしたいなら明示的にdouble型にして 呼び出しましょう。
double型にするのは、サンプルプログラムだけではなく、「obj.add((double)10)」でもかまいません。
メソッドで引数にdouble型だけの場合には、「obj.add(10)」でも「obj.add(double)」がアクセスされます。

7−2−3.メソッドのオーバーロード及び戻り値の関係

 上記の説明では、同じメソッド名に全部一緒の戻り値の型でした。
ですが、オーバーロードが区別するのは引数だけなので、戻り値はメソッド名ごとに合わす必要はありません。
ということは、戻り値の型だけを変更して同じメソッド名では、例えば、次のように宣言するとコンパイルエラーです。
public int getValue();
public String getValue();
これは、同じメソッド名でどちらとも引数が無しに宣言されている為です。
よって、オーバーロードは、戻り値の型で区別せず、引数でメソッドを区別している事が分かります (プログラミング規則)。

 では、Sample7_2_1を少し改造してみましょう。

Sample7_2_2.java
// 改良版計算機
class ImprovementCal {

    // 引数が2つでint型及びint型、データ1にデータ2を足して返す
    public int add(int data1, int data2) {

        System.out.print("add(int, int)");

        return data1 + data1;
    }

    // 引数が2つでint型及びdouble型、データ1にデータ2を足して返す
    public double add(int data1, double data2) {

        System.out.print("add(int, double)");

        return data1 + data2;
    }

    // 引数が2つでdouble型及びdouble型、データ1にデータ2を足して返す
    public double add(double data1, double data2) {

        System.out.print("add(double, double)");

        return data1 + data2;
    }

}

public class Sample7_2_2 {

    public static void main(String[] args) {

        ImprovementCal obj = new ImprovementCal();
        System.out.println(":" + obj.add(10, 10));
        System.out.println(":" + obj.add(10, 10.5));
        System.out.println(":" + obj.add(10.5, 10.5));
    }
}
  
add(int, int):20
add(int, double):20.5
add(double, double):21.0

 戻り値でメソッドが区別されるわけではありませんので、メソッドによって戻り値を設定する事により、柔 軟なプログラムを書く事ができます。
又、メソッド名を変えるか又はオーバーロードの仕組みを使い引数によってプログラムを作成するかは、仕様 書による事も多いです。
ですが、場合によってはプログラマが決める為、プログラミングのセンスに関わってくる箇所でもあります。
場合によってとは、例えば、内部処理(例えばprivateなメソッド)などの他に影響を当て得ないような場合又 は設計段階に関われるプログラマなどです。

 以下は、同じ処理をメソッド名で分けた場合及びオーバーロードの仕組みを利用した場合の例です。
●オーバーロードの場合
public int add(int data1, int data2);
public double add(double data1, double data2);
●メソッド名で区別の場合
public int addToInt(int data1, int data2);
public int addToDouble(double data1, double data2);
 メソッド名又はオーバーロードのどちらがいいのかですが、これはケースバイケースです。
メソッド名で機能が分かりメソッド名を統一する事でそれ自体がグループになっていればいいのですが、 あまりにも引数の違いだけで同じメソッド名が大量に合っては、かえって意味が分かりづらくなります。
又、上記のメソッド名の区別の場合は、メソッド名実体で分かりますが、メソッド名が長くなる傾向にもなりま す。
これは、プログラムを学んでいくうちに鍛錬される事でもありますが、プログラムにおいてはこういうセンス も大事なのです。

1時間目 アクセス修飾子に戻る     3時間目 コンストラクタに進む

単位7 クラスの特徴に戻る

トップページに戻る