【Java】オーバーロードメモ

# オーバーロード
オーバーロードについて学んだことのメモ書きです。
## オーバーロードとは
**「同名だが、引数の型や数が異なる」[メソッド] 又は [コンストラクタ] を 複数記述すること** です。

呼び出す場合は、**「[引数]の型 や [引数]の数 が 同等」** な [メソッド]
又は [コンストラクタ] が呼ばれ処理を行います。

## オーバーロードのメリット
攻撃を行う「　attack　」、足し算を行う「 Plus 」など、[メソッド]の名前をわかりやすく、短く命名したかったり、適切な [メソッド]名が思い浮かばくてもともとあるメソッド名を使いまわしたい場面がでてくるとおもいます。

ですが、「**原則的に同名の[メソッド]は定義することが出来ません。**」
例えば、「 計算 」を行う名前の同じ[メソッド]が存在すると、コンピューターが 「どの計算メソッドだよ！」ってわからなくなってしまうためです。

ただし、[引数]の型や個数が違う場合は同名のメソッドがあっても、引数が違えばどれを呼べばいいのかコンピュータが判断できるようになり、同名の[メソッド]を定義することができます。

「[引数] によって最終的な処理結果を変更」したり、「処理の結果にバリエーションをもたせたりすることが可能」ですごく便利。

### オーバーロードの使い方
[メソッド]をオーバーロードする例です。
「 plus 」をいう同名の[メソッド]を複数記述していますが、**与えられる[引数]の数によって返す値がことなります！**


```java
public class Sum {

    public int plus(int a) {
        return a + 1;
    }

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

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

[コンストラクタ]をオーバーロードする例


```java
public class Sum {

    private int a;
    private int b;
    private int c;

    public Sum(int a) {
        this.constructor(a, 0, 0);
    }

    public Sum(int a, int b) {
        this.constructor(a, b, 0);
    }

    public Sum(int a, int b, int c) {
        this.constructor(a, b, c);
    }

    private void constructor(int a, int b, int c) {
        this.a = a;
        this.b = b;
        this.c = c;
        System.out.println("abc = " + (this.a + this.b + this.c));
    }
}
```

### デフォルトコンストラクタ
通常、[コンストラクタ]は、その[クラス]内に何も記述しなければ デフォルトコンストラクタ が用意されます。
（※コード上にはないが、実処理（ new クラス名 ）のタイミングで空のコンストラクタ（ public Sum() {} ）を呼び出している状態となります。

### オーバーロードを生かしたコンストラクタ

冗長な記述を減らすことで、可読性が高い初期化処理の実現に役立ちます。
ですが、以下の場合はコンパイル時点で エラー「再帰的コンストラクター」 を吐いてしまい、処理を実現することができません。

```java
// A
public Sum(int a) {
    this(a, 0, 0); // ←こちらはOK
}

// B
public Sum(int a, int b) {
    this(a, b, 0); // ←こちらもOK
}

// C
public Sum(int a, int b, int c) {
    this(a, b, c); // ←こちらを記述したタイミングでエラー
}
```

なぜエラーが起きるかというと、
「**C自身が、自分の[コンストラクタ]を呼び出すことによる処理の終結が無いから**」です！

1. A と B → C を呼び出す　
2. C → Cを呼び出す

結局Cにいきつくため、Cを読み込んだのと同じ状態になり、[コンストラクタ]の処理が終わらない状態になります。

そのため、３つの[コンストラクタ]内で共通で使用できる[メソッド] (今回の場合：constructor() )を用意して一つの口で初期化できるようにしています。

## 例題
フルネームを出力するプログラムを組んでみました。

**【fulNameMain.java】**

```java
package practice_overlord;

public class fullNameMain {

    public static void main(String[] args) {
        FullName fullName = new FullName();
        String printfullName = fullName.anchorName("ゴール", "D", "ロジャー");
        System.out.println(printfullName);
    }

}
```

【FullName.java】

```java
package practice_overlord;

public class FullName {
    public String anchorName(String firstName) {
        return firstName + 1;
    }

    public String anchorName(String firstName, String lastName) {
        return firstName + " " + lastName;
    }

    public String anchorName(String firstName, String middleName, String lastName) {
        return firstName + " " + middleName + " " + lastName;
    }
}
```


[インスタンス]:https://qiita.com/takahirocook/items/ec01cdcbb440cf0d1cc4
[インスタンス化]:https://qiita.com/takahirocook/items/ec01cdcbb440cf0d1cc4
[アクセス修飾子]:https://qiita.com/takahirocook/items/e51b0b9d37d95ad587fe
[フィールド]:https://qiita.com/takahirocook/items/28df75a133049a74ece1
[フィールド変数]:https://qiita.com/takahirocook/items/28df75a133049a74ece1
[new演算子]:https://qiita.com/takahirocook/items/00f9f97592bf50831d39
[カプセル化]:https://qiita.com/takahirocook/items/e469a7c0539a0012868e
[クラス]:https://qiita.com/takahirocook/items/50cbbdca8e21539170e9
[メソッド]:https://qiita.com/takahirocook/items/5bfe43576d87a2a4006c
[mainメソッド]:https://qiita.com/takahirocook/items/f4635915337303de338c
[メソッドの呼び出し]:https://qiita.com/takahirocook/items/f4635915337303de338c
[コンストラクタ]:https://qiita.com/takahirocook/items/fa1822f2f22c3786593e
[引数]:https://qiita.com/takahirocook/items/5e5b0ba79e869f4a592e
[戻り値]:https://qiita.com/takahirocook/items/3b6fa670a1d6dd4a9386
[this]:https://qiita.com/takahirocook/items/d251ec4693c68f6b9538
[getter・setter]:https://qiita.com/takahirocook/items/27828bc8477735612021
[setter]:https://qiita.com/takahirocook/items/27828bc8477735612021
[getter]:https://qiita.com/takahirocook/items/27828bc8477735612021
[オブジェクト指向]:https://qiita.com/takahirocook/items/041ba7a096b71ab8ffd4
[継承]:https://qiita.com/takahirocook/items/6c84ea66a6e2ad536a37