クラスの継承とは

## 継承
* クラスが持っているメンバ（フィールドやメソッド）を別のクラスに引き継がせる。
* 継承元のクラスをスーパークラス（または親クラス）、引き継いだクラスをサブクラス（または子クラス）
(継承を使用しない例と使用する例のコードも記載されていてわかりやすかった[参照元URL](https://medium-company.com/java-%E7%B6%99%E6%89%BF/#google_vignette))

```Java
// 継承の書き方

子クラス extend 親クラス
```


##### 実例
作成クラス3つ。

1. Keisyo_Human1.java：人を表す親クラス
1. Keisyo_Takada1.java：親クラスを継承する子クラス
1. Keisyo_Main1.java：実行クラス

` Keisyo_Human1.java`
 ```Java
public class Keisyo_Human1 {
	
	// フィールドの宣言
	double weight; // 体重
	double height; // 身長
	
	// BMI計算メソッド 修飾子なし＝同じパッケージ内であればアクセス可能
	double Bmi( double weight, double height) {
		return this.weight / (this.height * this.height);
	}
}
```
`Keisyo_Takada1.java`
```Java
// 継承
public class Keisyo_Takada1 extends Keisyo_Human1 {
}
```

`Keisyo_Main1`
```java
public class Keisyo_Main1 {
	public static void main(String[] args) {
		
		// Keisyo_Takada1クラスのオブジェクト生成
		Keisyo_Takada1 takada = new Keisyo_Takada1();
		
		// 体重を設定
		takada.weight = 100.0;
		// 身長を設定
		takada.height = 1.9;
		
		//BMIのメソッド呼び出し
		double bmi = takada.Bmi(takada.weight, takada.height);
		System.out.println("BMIは" + bmi);
	}

}
```

実行結果
![スクリーンショット 2024-02-13 14.32.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/d1cf8701-21ab-979e-3902-dc5fdea7e373.png) 

#### 検証1　
継承なしの場合
``` Java
//コンストラクタが必要になる


package text.section_17;

public class Keisyo_Human1 {
	
	// フィールドの宣言
	double weight; // 体重
	double height; // 身長
	
    // コンストラクタ
    public Keisyo_Human1(double weight, double height) {
        this.weight = weight;
        this.height = height;
    }
	
	// BMI計算メソッド 修飾子なし＝
	double Bmi( ) {
		return this.weight / (this.height * this.height);
	}
}
```
`Kida`というオブジェクトを生成
```java
package text.section_17;

public class Keisho_Kida {

	public static void main(String[] args) {
		//オブジェクトの生成
		Keisyo_Human1 Kida = new Keisyo_Human1(70, 1.75);
		
//		// 体重と身長を設定
//		Kida.weight = 70.0; // 体重（kg）
//		Kida.height = 1.75; // 身長（m）
		
		// BMIを計算して表示
        double bmi = Kida.Bmi();
        System.out.println("BMI: " + bmi);//メソッドの呼び出し
	}

}
```
実行結果
問題なく実行はできた。
![スクリーンショット 2024-02-13 15.21.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/f6529615-aca6-74cd-0aa5-33025e661e68.png)


#### 検証2
継承だけを設定しているクラス`Keisyo_Takada1.java`がなく、
クラスの設定をしている`Keisyo_Human1.java`に変更を加えない。そして、
同じクラス内に、継承とオブジェクトの生成・メソッドの実行を記述した場合。
→問題なく同じ実行結果が得られる。
![スクリーンショット 2024-02-13 14.43.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/972380be-2d49-fe7d-57cc-8f81a41d6359.png)
実行結果
![スクリーンショット 2024-02-13 14.45.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/832b8056-42a7-01c5-6451-71d500a4050c.png)

継承の使いどころとは？
例えば、女性or男性などの条件分岐を使う表示が必要な場合は、条件分岐ではなく継承でも良いのか？
大規模な開発の場合は継承は使われることも多いが、個人での開発レベルだと素直に条件分岐で書いた方がわかりやすいとベテランのある方に教えていただきました。

参考にした[記事](https://medium-company.com/java-%E7%B6%99%E6%89%BF/)

## メソッドのオーバーライドとスーパー
### オーバーライド
* 子クラスで親クラスのメソッドを上書きすることができる
* ただし、上書きできるのは引数名と処理だけ
* メソッド名、戻り値の型、引数の数、引数の型は親クラスのメソッドと同じにする必要がある

### スーパー
* 親クラスのコンストラクタを呼び出すことができる
* 自身のフィード変数を呼び出すのは`this`に対して、継承元の値を呼び出すのが`super`

![スクリーンショット 2024-02-14 8.45.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/d8f749a6-8869-195d-17f8-fabae5d58eab.png)
逆に、`this("Kato");`にすると70.0が表示される。

## 多態性（ポリモーフィズム）
`abstract`の親を2つのクラスが継承し、
それぞれoutputメソッドで引数を`Kato`、もう一方は`Tanaka`と設定をする。
その後、別クラスでそれぞれが親クラスからオブジェクトを生成。
そしてメソッドを呼び出した結果、オブジェクトごとに別の結果を表示させることができる。
![スクリーンショット 2024-02-14 9.27.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570384/2c25ccfc-a717-1f73-cada-b6cfd62ac68c.png)