Javaの継承

###継承
既存のクラスのフィールドやメソッドを別のクラスに引き継ぐことです。
継承してできる新しいクラスには独自のフィールドやメソッドを追加してカスタマイズできます。
継承されるクラスを「スーパークラス」、継承してできる新しいクラスを「サブクラス」と呼びます。
継承を用いて新しくサブクラスを定義するときは、「extends」を用いてクラスを定義します。

```
class サブクラス名 extends スーパークラス名 {
}
```
**extends スーパークラス名**でスーパークラスを継承します。

【例】Bicycle.javaとCar.javaの内容が重複しているものとします

```Main.java
class Main {
  public static void main(String[] args) {
〜省略〜
 }
}
```

```Bicycle.java
class Bicycle extends Vehicle {

}
```

```Car.java
class Car extends Vehicle{
  
}
```

```Vehicle.java
class Vehicle {
〜省略〜  //Bicycle.javaとCar.javaの重複している部分
}
```
###スーパークラスのメソッドの呼び出し
サブクラスはスーパークラスのフィールドとメソッドを引き継いでいます。
サブクラスのインスタンスに対して、スーパークラスのインスタンスメソッドを呼び出すことができます。
【例】上記の続きとします

```Main.java
class Main {
  public static void main(String[] args) {
    Car car = new Car();
    car.setName("フェラーリ");  //carの名前を指定してます
    car.setColor("赤");  //carの色を指定してます
    
    Bicycle bicycle = new Bicycle();
    bicycle.setName("ビアンキ");  //bicycleの名前を指定してます
    bicycle.setColor("緑");  //bicycleの色を指定してます
    
    System.out.println("【車の情報】");
    car.printData();

    System.out.println("=================");
    System.out.println("【自転車の情報】");
    bicycle.printData();
  }
}
```
###サブクラスのフィールドとメソッド
サブクラスのインスタンスは、自身のクラスに定義したメソッドとスーパークラスのメソッドも呼び出せます。
一方スーパークラスのインスタンスはサブクラスのメソッドを呼びだすことはできません。
サブクラスのインスタンスに対して、呼び出したメソッドが、サブクラスに定義されていればサブクラスから、定義されていなければスーパークラスから呼び出されます。
【例】上記の続きとします

```Main.java
class Main {
  public static void main(String[] args) {
    Car car = new Car();
    〜省略〜
    int litre = scanner.nextInt();
    car.charge(litre);
    〜省略〜
    bicycle.printData();
  }
}
```

```Car.java
class Car extends Vehicle{
  public void charge(int litre) {
    System.out.println(litre + "L給油します");
    if (litre <= 0) {
      System.out.println("給油できません");
    } else if (litre + this.fuel >= 100) {
      System.out.println("満タンまで給油します");
      this.fuel = 100;
    } else {
      this.fuel += litre;
    }
    System.out.println("ガソリン量：" + this.fuel + "L");
  }
}
```
###オーバーライド
スーパークラスから継承したメソッドと同名のメソッドをサブクラスに定義することで、スーパークラスのメソッドの内容を上書きすることができることを**オーバーライド**と言います。
サブクラスのインスタンスに対してメソッドを呼び出すと、まずサブクラスの中でそのメソッドを探し、持っていればそのメソッドを呼び出します。
つまりスーパークラスと同名のメソッドがサブクラスにあれば、それが実行されるので、結果的にメソッドの内容が上書きされます。
【例】上記の続きとします

```Car.java
class Car extends Vehicle{
  public void charge(int litre) {

  public void printData() {
  System.out.println("名前：" + this.getName());
  System.out.println("色：" + this.getColor());
  System.out.println("走行距離：" + this.getDistance() + "km");
  System.out.println("ガソリン量：" + this.getFuel() + "L");
  }
〜省略〜
}
```
省略してますが、Vehicle.javaの内容を上書きしています。
Vehicle.javaの内容が重複している部分は消します。
消し方は「super.メソッド名()」を使います。
「super.メソッド名()」とすると、サブクラスのインスタンスメソッドから、スーパークラスのインスタンスメソッドを呼び出すことができます。
【例】上記の続きとします

```Car.java
class Car extends Vehicle{
  public void charge(int litre) {

  public void printData() {
  super.printData();  //重複している部分を消しています
  System.out.println("ガソリン量：" + this.getFuel() + "L");  //こちらは重複していないとします
  }
〜省略〜
}
```
次は、サブクラスでコンストラクタを定義します。
スーパークラスのコンストラクタを呼び出すには、「super()」を使用します。
【例】上記の続きとします(nameとcolorを「super()」で呼び出します)

```Bicycle.java
class Bicycle extends Vehicle
  Bicycle(String name, String color) {  //Bicycleクラスのコンストラクタを定義しています
    super(name, color);   //superを用いてスーパークラスのコンストラクタを呼び出してます
  }
}
```

```Car.java
class Car extends Vehicle{

  Car(String name, String color) {
    super(name, color);
  }
〜省略〜
}
```

```Vehicl.java
class Vehicle {
  private String name;
  private String color;
  private int distance = 0;
  
  Vehicle(String name, String color) { // Vehicleクラスのコンストラクタを定義しています
    this.name = name;
    this.color = color;
  }
〜省略〜
}
```