【Java】super ( 一つ内側のインスタンス部分 )


# super

「今より一つ内側の[インスタンス]部分」を表す予約語」

## 【説明】


つまり、子クラスの[インスタンス]から、親クラスの[インスタンス]のメンバにアクセスして、値を参照する必要があるときにsuperが使用されます。

<!-- メリット「使うことのメリット」 -->
## 【メリット】
親インスタンス部分 の[メソッド]や[フィールド]に、小[インスタンス]からアクセスすることが出来る。

<!-- 特徴「特筆すべき所」 -->
## 【特徴】
### 「親の親」インスタンス部分へのアクセスは出来ない
下記のような継承関係の３つの[クラス]を例えにします。

- A[クラス] = 親の親
- B[クラス] = 親
- C[クラス] = 自分

C[クラス]から生成された[インスタンス]は3種構造になり、この時一番外側に相当するC[インスタンス]について考えます。

C[クラス]の[メソッド]は、一番外側の[インスタンス]部分（自分自身）には [this], そして親[インスタンス]部分へは super でアクセスが出来ます。
しかし、残念ながら親の親に当たるA[クラス]の[インスタンス]にはアクセスする手段が準備されていないため、C →　A にはアクセスが出来ないということです。

<!-- 使用場面 「いつつかうか？」「どこで、つかうか？」-->
## 【使用場面】

サブクラスで [オーバーライド]（親クラスの[メソッド]を子クラスで[継承]）された変数や[インスタンス]を参照する時に使用される。

## superをつけないと？

例えば、親クラスに「attack()」 という[メソッド]があり、子[インスタンス]からアクセスしようとする場合を例でいうと、結論、

super をつけないと**「外側で attack() を呼び続ける無限ループ」になってしまいます。**
super をつけないということは**`this.attack`**と同じ意味になってしまうためです。
[this]は「自分自身の[インスタンス]という意味」で、より正確には、「[インスタンス]の最も外側部分」を言う意味であるため上記の通り、[メソッド]の無い部分をずっとつづけることになる、ということになります。

<!-- ここから 各キャプチャー↓↓↓↓↓↓↓↓↓↓↓↓↓↓ -->
<!-- サンプルコード、サブセクションを記述↓↓↓↓↓ -->

<!-- 基本構文など -->
## 【書き方】
[コンストラクタ]を[オーバーライド]する際は1行目に「super()」と記述する必要があります。

### 親[インスタンス]部分の[フィールド]を利用する時

```
super.フィールド名
```

### 親[インスタンス]部分の[メソッド]を呼び出す時

```
super.フィールド名([引数])
```

<!-- ここから サンプルコード ★☆★☆★☆★☆★ -->
<!-- サンプルコードタイトル -->
## 【サンプルコード】 super で親クラスの[コンストラクタ]を呼び出す

<!-- サンプルコード概要 -->

<!-- サンプルコード -->
### 【Main.java】

```java
public class Main {
    public static void main(String[] args) throws Exception {
        // SubClassの コンストラクタ を呼び出す。
        SubClass sbc = new SubClass(); // 出力結果はSubClass.javaで格納された値によって変わる
    }
}
```
### 【SuperClass.java】
親クラスです。ここで[メソッド]を定義しています。

```java
class SuperClass {

    public SuperClass() {
        System.out.println("Super_Const");
    }

    public SuperClass(String str) {
        System.out.println("文字列型の引数: " + str);
    }

    // int型の場合のメソッド
    public SuperClass(int num) {
        System.out.println("int型の引数: " + num);
    }
}

```
### 【SubClass.java】
こちらは子[クラス]。extendsで 親[クラス]の SuperClassを[継承]しています。
[コンストラクタ]から、superを使用して[引数]で文字列"apple"を指定。
int型の[コンストラクタ]を呼び出したい場合は、super(int型)を指定します。

```java
// 親クラスの SuperClass を継承
class SubClass extends SuperClass {


    public SubClass(){ // コンストラクタ 定義
        super("サブクラスで文字列型の引数を格納"); //super を使用して 文字列の 引数を指定。
    }
}
```


<!-- 実行結果 -->
### 【実行結果】

```
文字列型の引数: サブクラスで文字列型の引数を格納
```

### 【SubClass.java】
ここで[引数]を 文字列型 → int型 にして出力すると出力結果が変わります。

```java
// 親クラスの SuperClass を継承
class SubClass extends SuperClass {
    public SubClass() { // コンストラクタ 定義
        super(200000); // super を使用して int型の 引数を指定。
    }
}
```

### 【実行結果】

```
int型の引数: 200000
```

<!-- サンプルコード説明があればここに記述 -->


<!-- ここまで サンプルコード ★☆★☆★☆★☆★ -->

<!-- サンプルコードや、サブセクションを記述↑↑↑↑↑ -->
<!-- ここまで 各キャプチャー↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ -->


## 【まとめ】

super は [オブジェクト指向]を学ぶ上で超重要な要素なので、今後もわかるまで更新を続けます。

## 参考文献・記事

- [【Java】superとは？意味や使い方について詳しく解説](https://www.sejuku.net/blog/20081)

<!-- 以下リンク -->

[Progate]:https://prog-8.com/
[ドットインストール]:https://dotinstall.com/
[abstract修飾子]:https://qiita.com/takahirocook/items/9fa0e1cbb8a4dd4e1ff4
[abstract]:https://qiita.com/takahirocook/items/9fa0e1cbb8a4dd4e1ff4
[import]:https://qiita.com/takahirocook/items/59a8a09cab6a98d3bca2
[this]:https://qiita.com/takahirocook/items/d251ec4693c68f6b9538
[super]:https://qiita.com/takahirocook/items/75a07131e7e791c8442c
[final]:https://qiita.com/takahirocook/items/5e0916d9bf28bcf68d0c
[final修飾子]:https://qiita.com/takahirocook/items/5e0916d9bf28bcf68d0c
[List]:https://qiita.com/takahirocook/items/4d622fc6f271569783b5
[list]:https://qiita.com/takahirocook/items/4d622fc6f271569783b5
[Map]:https://qiita.com/takahirocook/items/49f46151ecb5e332db32
[map]:https://qiita.com/takahirocook/items/49f46151ecb5e332db32
[set]:https://qiita.com/takahirocook/items/d498329cd26e1500f476
[Set]:https://qiita.com/takahirocook/items/d498329cd26e1500f476
[Date]:https://qiita.com/takahirocook/items/a760e20ef2d9aa5c08fc
[SimpleDateFormat]:https://qiita.com/takahirocook/items/aa857c8f2153193095e4
[Time]:https://qiita.com/takahirocook/items/9caef0bb2409caedba55
[Calendar]:https://qiita.com/takahirocook/items/204dd7331db777eb6f3b
[mainメソッド]:https://qiita.com/takahirocook/items/f4635915337303de338c
[printf()メソッド]:https://qiita.com/takahirocook/items/06d525be63eccd99ed49
[printf()関数]:https://qiita.com/takahirocook/items/06d525be63eccd99ed49
[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
[new演算子]:https://qiita.com/takahirocook/items/00f9f97592bf50831d39
[new]:https://qiita.com/takahirocook/items/00f9f97592bf50831d39
[static修飾子]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
[static]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
<!-- あ行 -->
[オブジェクト指向]:https://qiita.com/takahirocook/items/041ba7a096b71ab8ffd4
[継承]:https://qiita.com/takahirocook/items/6c84ea66a6e2ad536a37
[オーバーライド]:https://qiita.com/takahirocook/items/09dd8e5f56d6617ce45a
[オーバーロード]:https://qiita.com/takahirocook/items/b937c3c07126fe7e02a4
[インスタンス]:https://qiita.com/takahirocook/items/ec01cdcbb440cf0d1cc4
[インスタンス化]:https://qiita.com/takahirocook/items/ec01cdcbb440cf0d1cc4
[アクセス修飾子]:https://qiita.com/takahirocook/items/e51b0b9d37d95ad587fe
[インスタンス化]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
[インスタンス変数]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
[インターフェイス]:https://qiita.com/takahirocook/items/ca84be8dfef664b19194
[インターフェース]:https://qiita.com/takahirocook/items/ca84be8dfef664b19194
[インポート]:https://qiita.com/takahirocook/items/59a8a09cab6a98d3bca2
<!-- か行 -->
[拡張for文]:https://qiita.com/takahirocook/items/470b2858de1a4f99b334
[クラスメソッド]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
[クラスフィールド]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
[クラス変数]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
[カプセル化]:https://qiita.com/takahirocook/items/e469a7c0539a0012868e
[クラス]:https://qiita.com/takahirocook/items/50cbbdca8e21539170e9
[コンストラクタ]:https://qiita.com/takahirocook/items/fa1822f2f22c3786593e
<!-- さ行 -->
[書式指定子]:https://qiita.com/takahirocook/items/06d525be63eccd99ed49
[静的メソッド]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
[静的変数]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
[静的メソッド]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
[スーパークラス]:https://qiita.com/takahirocook/items/75a07131e7e791c8442c
<!-- た行 -->
[定数]:https://qiita.com/takahirocook/items/5e0916d9bf28bcf68d0c
[抽象クラス]:https://qiita.com/takahirocook/items/9fa0e1cbb8a4dd4e1ff4
[抽象メソッド]:https://qiita.com/takahirocook/items/9fa0e1cbb8a4dd4e1ff4
[動的メソッド]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
<!-- な行 -->
[日時の文字列操作]:https://qiita.com/takahirocook/items/aa857c8f2153193095e4
<!-- は行 -->
[パッケージ]:https://qiita.com/takahirocook/items/39b58d17abcb159ef5c1
[引数]:https://qiita.com/takahirocook/items/5e5b0ba79e869f4a592e
[配列]:https://qiita.com/takahirocook/items/16a123fb73b30869053b
[配列操作]:https://qiita.com/takahirocook/items/16a123fb73b30869053b
[日付操作]:https://qiita.com/takahirocook/items/9caef0bb2409caedba55
[フィールド]:https://qiita.com/takahirocook/items/28df75a133049a74ece1
[フィールド変数]:https://qiita.com/takahirocook/items/28df75a133049a74ece1
[インスタンスフィールド]:https://qiita.com/takahirocook/items/cf527f85d17a5af86735
<!-- ま行 -->
[戻り値]:https://qiita.com/takahirocook/items/3b6fa670a1d6dd4a9386
[メソッド]:https://qiita.com/takahirocook/items/5bfe43576d87a2a4006c
[メソッドの呼び出し]:https://qiita.com/takahirocook/items/f4635915337303de338c
<!-- や行 -->
<!-- ら行 -->
<!-- わ行 -->