【Java】オーバーロードとは

プログラムを書いていくと、似たような処理をするメソッドがでてくる場合があります。

しかし、基本的に同じメソッド名をつけることはできません。

なぜなら、メソッドを呼び出す際、同じメソッド名だとどちらのメソッドを呼び出せばよいのかわからなくなるからです。

しかし、Javaには、例外としてオーバーロードによって、同じメソッド名をつけてもよいことになっています。

本記事では、このオーバーロードについて紹介します。

オーバーロードとは

以下の条件を満たすことで同じメソッド(コンストラクタ)名を定義することです。

条件(いずれかを満たせばよい)

引数の数が異なる

public int add(int a,int b){
    return a+b;
}
public int add(int a,int b,int c){
    return a+b;
}

引数の型が異なる

public int add(int a,int b){
    return a+b;
}
public double add(double a,double b){
    return a+b;
}

引数の型の順番が異なる

public double add(int a, double b){
    return a+b;
}
public double add(double a,int b){
    return a+b;
}

このような引数の数、型、順番の情報をシグネチャといいます。

したがって、オーバーロードは、シグネチャが異なる場合のみ許されると言い換えることもできます。

メソッドを例としていましたが、コンストラクタでも同様です。

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

引数の変数名のみが異なる場合

public int add(int a,int b){
    return a+b;
}
public int add(int c,int d){
    return a+b;
}

戻り値のみが異なる場合(メソッドの場合)

public int add(int a, int b){
    return a+b;
}
public void add(int a, int b){
    System.out.println(a+b);
}

オーバーロードしたメソッドを呼び出す

引数の型、順番、数で呼ぶメソッドを判断しています

public class Overload{
    public static void main(String[] args){
        System.out.println(add(3,4)); // 7
        System.out.println(add(3.0,4.0)); // 7.0
    }
    public static int add(int a, int b){
        return a + b;
    }
    public static double add(double a,double b){
        return a + b;
    }
}

オーバーロードしたコンストラクタを呼び出す

引数の型、順番、数で呼ぶコンストラクタを判断しています

public class Overload{
    public static void main(String[] args){
        Person p1 = new Person(); // suzuki
        System.out.println(p1.name);
        Person p2 = new Person("tanaka"); // tanaka;
        System.out.println(p2.name);
    }
}
class Person{
    String name;
    public Person(String name){
        this.name = name;
    }
    public Person(){
        this.name = "suzuki";
    }
}

因みに似たような言葉としてオーバーライドがありますが、違う意味になります。