javaの継承について

#継承
クラスの中身である変数やメソッドを、他のクラスに受け継がせること。

java, ruby, pythonなどのオブジェクト指向プログラミング言語がもつ特徴


元となるクラスを親クラス（スーパークラス・基底クラス）
受け継ぎ先のクラスを子クラス（サブクラス・派生クラス）

ーーー継承のイメージーーー

Animal（親クラス）
変数
・name（名前）
・age（年齢）
メソッド
・eat（食べる）
・walk（歩く）

↓↓

Dog（子クラス）
追加メソッド
・bark（吠える）
・run（走る）

human（子クラス）
追加メソッド
・talk（話す）
・work（働く）

ーーーーーーーーーーーー

上記イメージのように、**共通の項目、性質を持った複数のクラスを作る**
ときに継承を使用する。

```java

//親クラスとなる動物クラス
public class Animal{
  public String name;  //名前
  public int age; //年齢
  public void eat(String something) {
      //食べる
     System.out.println(something + "を食べました");
  }
  public void walk(int a){ 
     //歩く 
     System.out.println(a.toString(); + "メートル歩きました");
  }
}


//動物クラスを継承して作った、犬クラス
public class Dog extends Animal {
  //吠える
  public void bark(){
    System.out.println("ワン");
  }
 //走る
 public void run() {
 }
}

//動物クラスを継承して作った、人間クラス
public class Human extends Animal {
  //しゃべる
 public void talk(String tk){
   System.out.println("「" + tk + "」");
 }
 //仕事をする
 public void work(){
 }
}
```

#継承を使うメリット
###１、プログラミングの行数が減り、手間も省ける
継承を使わない場合、

```java
//動物クラスを継承しないで作った、犬クラス
public class Dog {
  public String name;  //名前
  public int age;//年齢

  public void eat(String something) {
      //食べる
      System.out.println(something + "を食べました");
  }
  public void walk(int a){ 
     //歩く 
     System.out.println(a.toString(); + "メートル歩きました");
  }
  //吠える
  public void bark(){
    System.out.println("ワン");
  }
 //走る
 public void run() {
 }
}

//動物クラスを継承しないで作った、人間クラス
public class Human extends Animal {
  public String name;  //名前
  public int age;//年齢

 public void eat(String something) {
      //食べる
      System.out.println(something + "を食べました");
  }
  public void walk(int a){ 
     //歩く 
     System.out.println(a.toString(); + "メートル歩きました");
  }

  //しゃべる
 public void talk(String tk){
   System.out.println("「" + tk + "」");
 }
 //仕事をする
 public void work(){
 }
}
```
親クラスの変数、メソッドを子クラス両方に重複して書いてしまう。❌
さらに、親クラスを変更しようとしたら２箇所変更しないといけない。❌
親クラスを一つにまとめていれば、変更も１箇所で良い。⭕️

###２、同じ継承元のクラスをまとめて扱うことができる
例えば、動物は全てトラックに乗せたい時、同じ動物というクラスを継承していればひとまとめに変数として扱うことができる

```java

//動物クラスの型のオブジェクトを格納する配列
Animal[] animals;
//犬も、人間も、まとめられる
animals = { new Dog(); new Human()};
```

#継承の特徴
###子クラスでは親クラスのフィールド（変数、メソッド）を使える
Animalのnameやeatはdogも持っている。
つまり、親クラスの機能は、見えないが子クラスも持っている。

###子クラスで親クラスのメソッドの上書き（オーバーライド）ができる
継承したメソッドを上書きできる。
これにより、同じメソッドでも違う機能を持たせることができる。
ただし、引数は揃える必要がある。

###継承の継承はできる（孫クラス）
子クラスを親にして、孫クラスを作成することができる。

```java

public class Animal {

}

public class Dog extends Animal {

}

pubic class WhiteDog extends Dog {
  public String color = "white";
}

```
上記は、白い犬を孫クラスとして作成



#継承の注意点
###親クラスにfinalを使ったフィールドは上書き禁止
finalをつけると、上書きができないメソッドになる。
勝手に処理を変更されたくない場合に使用する。

###２つのクラスを同時に継承することはできない

```java
class Tuna extends Animal, Fish  
```
上記は、マグロに対し動物と魚を継承しようとしているができない❌

###コンストラクタは継承されず、暗示的に実行される
[※コンストラクタとは](https://www.javadrive.jp/start/constructor/index1.html#:~:text=%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF%E3%81%A8%E3%81%AF%E3%80%81%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%8B%E3%82%89,%E3%81%AE%E4%B8%BB%E3%81%AB%E8%A1%8C%E3%81%84%E3%81%BE%E3%81%99%E3%80%82&text=%E3%83%A1%E3%83%B3%E3%83%90%E5%A4%89%E6%95%B0%E3%81%AE%E5%AE%9A%E7%BE%A9%E6%99%82%E3%81%AB,%E3%81%93%E3%81%A8%E3%81%8C%E5%87%BA%E6%9D%A5%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82)
クラスからからオブジェクトを作成した際に、自動的に実行されるメソッドのこと

```java

public Dog extends Animal {
  //コンストラクタ
  Dog(){
  }
}
```

```java

public Dog extends Animal {
  //コンストラクタ
  Dog(){
    super();
  }
}
```
上と下のコードは同じ意味になる。
子クラス内でコンストラクタを上書きしようとしても、暗示的に親クラスのコンストラクタも実行される。
子クラスにコンストラクタがない場合も、親クラスのコンストラクタは実行される。