継承
既存のクラスのフィールドやメソッドを別のクラスに引き継ぐことです。
継承してできる新しいクラスには独自のフィールドやメソッドを追加してカスタマイズできます。
継承されるクラスを「スーパークラス」、継承してできる新しいクラスを「サブクラス」と呼びます。
継承を用いて新しくサブクラスを定義するときは、「extends」を用いてクラスを定義します。
class サブクラス名 extends スーパークラス名 {
}
extends スーパークラス名でスーパークラスを継承します。
【例】Bicycle.javaとCar.javaの内容が重複しているものとします
class Main {
public static void main(String[] args) {
〜省略〜
}
}
class Bicycle extends Vehicle {
}
class Car extends Vehicle{
}
class Vehicle {
〜省略〜 //Bicycle.javaとCar.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();
}
}
サブクラスのフィールドとメソッド
サブクラスのインスタンスは、自身のクラスに定義したメソッドとスーパークラスのメソッドも呼び出せます。
一方スーパークラスのインスタンスはサブクラスのメソッドを呼びだすことはできません。
サブクラスのインスタンスに対して、呼び出したメソッドが、サブクラスに定義されていればサブクラスから、定義されていなければスーパークラスから呼び出されます。
【例】上記の続きとします
class Main {
public static void main(String[] args) {
Car car = new Car();
〜省略〜
int litre = scanner.nextInt();
car.charge(litre);
〜省略〜
bicycle.printData();
}
}
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");
}
}
オーバーライド
スーパークラスから継承したメソッドと同名のメソッドをサブクラスに定義することで、スーパークラスのメソッドの内容を上書きすることができることをオーバーライドと言います。
サブクラスのインスタンスに対してメソッドを呼び出すと、まずサブクラスの中でそのメソッドを探し、持っていればそのメソッドを呼び出します。
つまりスーパークラスと同名のメソッドがサブクラスにあれば、それが実行されるので、結果的にメソッドの内容が上書きされます。
【例】上記の続きとします
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.メソッド名()」とすると、サブクラスのインスタンスメソッドから、スーパークラスのインスタンスメソッドを呼び出すことができます。
【例】上記の続きとします
class Car extends Vehicle{
public void charge(int litre) {
public void printData() {
super.printData(); //重複している部分を消しています
System.out.println("ガソリン量:" + this.getFuel() + "L"); //こちらは重複していないとします
}
〜省略〜
}
次は、サブクラスでコンストラクタを定義します。
スーパークラスのコンストラクタを呼び出すには、「super()」を使用します。
【例】上記の続きとします(nameとcolorを「super()」で呼び出します)
class Bicycle extends Vehicle
Bicycle(String name, String color) { //Bicycleクラスのコンストラクタを定義しています
super(name, color); //superを用いてスーパークラスのコンストラクタを呼び出してます
}
}
class Car extends Vehicle{
Car(String name, String color) {
super(name, color);
}
〜省略〜
}
class Vehicle {
private String name;
private String color;
private int distance = 0;
Vehicle(String name, String color) { // Vehicleクラスのコンストラクタを定義しています
this.name = name;
this.color = color;
}
〜省略〜
}