LoginSignup
0
1

More than 3 years have passed since last update.

Javaの継承

Last updated at Posted at 2020-06-15

継承

既存のクラスのフィールドやメソッドを別のクラスに引き継ぐことです。
継承してできる新しいクラスには独自のフィールドやメソッドを追加してカスタマイズできます。
継承されるクラスを「スーパークラス」、継承してできる新しいクラスを「サブクラス」と呼びます。
継承を用いて新しくサブクラスを定義するときは、「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;
  }
省略
}
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1