【Java】オーバーライドメモ

# オーバーライド
オーバーライドとは、[継承]関係において 
「**スーパークラスの[メソッド]の処理をサブクラスの同名の[メソッド]で重ねて処理結果を変えること**」です。

[継承]関係以外では、この現象は起こりません が、[継承]するサブクラスを作成するときは、
多少スーパークラスのことを知らないと意図せずオーバーライドしてしまうことがありますので注意してください。


## オーバーライドの仕組み

1. スーパークラスがサブクラスの[インスタンス]に対して[メソッド]を呼び出す
2. サブクラスの中でその[メソッド]を探す
3. 持っていればその[メソッド]を呼び出す。

つまり 「**スーパークラス と同名の [メソッド] がサブクラスにあれば、それが優先的に実行される。**」

つまり**「[メソッド] の内容が 上乗せされた」**ような結果になります。

## サンプルコード
こちらは継承元のスーパークラスです。

```java
public class SuperOverride {
    public void testOverride() {
        System.out.println("オーバーライド前はこの表示が出ます");
    }

}
```

こちらはスーパークラスを継承したサブクラスです。

```java
// スーパークラスを継承します
public class SubOverride extends SuperOverride {
    public void testOverride() {
//testOverrideメソッドをオーバーライドします。
        System.out.println("オーバーライドされるとこの表示になります");
    }
}
```

こちらのクラスで実行します。

```java
public class Main {

    public static void main(String[] args) {
        SubOverride subor = new SubOverride();
        subor.testOverride();
    }

}
```

実行結果

```
オーバーライドされるとこの表示になります
```

上記のコードを解説すると

testOverride[メソッド]を継承先のサブクラス SubOverride で上書きすることで、出力結果がオーバーライドされた内容になっています。

## オーバーライドを回避する書き方(サンプル)

オーバーライドされていない出力をするならこのように記述します

```java
// スーパークラスを継承します
public class SubOverride extends SuperOverride {
    public void testOverride() {
//testOverrideメソッドをオーバーライドします。
			
			//スーパークラスのtestOverride メソッドの呼び出し
        super.testOverride();
    }
}
```
コード内にもあるように
「**super キーワードを指定して**」、 testOverride() [メソッド]を呼び出しています。
こうすることでスーパークラスであるSuperOverride[クラス]のtestOverride() [メソッド]が呼び出されます。

## オーバーライドの利用例

特定のサブクラスにおいて、当該[メソッド]の処理内容を修正・変更する という利用例があります。

**「大本のスーパークラスに手を加えず、修正内容をサブクラスのみに適用したいとき」**にオーバーライドは非常に便利だと思います。

とくに、RPGのキャラが行う特定のアクションを行う場合に、オーバーライドはよく用いられるようです。

すべてのキャラが固有で持っている 「attack[メソッド]」をオーバーライドして、

- **ナッシーは「ねむりごな」**
- **ルージュラは「あくまのキッス」**
- **ダグトリオは「じわれ」**

といった具合で内容を上乗せします。

【Nassy.java】

```java
    public void attack() {
        // ねむりごなの処理
    }
```

【kentaros.java】

```java
    public void attack() {
        // はかいこうせんの処理を書く
    }
```
【Dugtrio.java】

```java
    public void attack() {
        // じわれの処理を書く
    }
```

以上のように、それぞれ違う部分だけをプログラミングするだけで済むので、効率の良いコードを書けるようになると思います。

[インスタンス]: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