クラスの継承
クラスを定義する際に、クラス名+extends
+基底クラス名とすることでクラスを継承し、その機能を使うことができる。
superキーワード
子クラスから親クラスのメソッドやフィールド、コンストラクタへアクセスするために用いる。
共通する処理は親クラスのメソッドに記述し、super
で参照する。
例
sample.java
public class Sample {
public static void main(String[] args) {
GasolineCar g = new GasolineCar("赤");
HybridCar h = new HybridCar("白");
g.drive(1.0);
h.drive(2.0);
}
}
Car.java
//基底クラス
public class Car {
double distance = 0.0; //総走行距離
String color = "";
//コンストラクタ
public Car(String color) {
this.color = color;
}
public void drive(double d) {
distance +=d;
}
}
GasolineCar.java
// extendsで継承
public class GasolineCar extends Car{
public GasolineCar(String color) {
super(color);//親クラスCarのコンストラクタを参照
}
public void drive(double d) {
super.drive(d);//親クラスのdriveメソッドを呼び出す
System.out.println("-----------------------");
System.out.println("ぶーん");
System.out.println("ガソリンを消費して"+d+"km走行しました。");
System.out.println("マイレージは、"+distance+"kmです。");
}
}
HybridCar.java
public class HybridCar extends Car {
public HybridCar(String color) {
super(color);
}
public void drive(double d) {
super.drive(d);
System.out.println("-----------------------");
System.out.println("すいーん");
System.out.println(d+"km走行しました。燃費もいいですよ");
System.out.println("マイレージは、"+distance+"kmです。");
}
}
抽象クラスと抽象メソッド
抽象化インスタンス化できないクラスで、abstract
を先頭につけて定義する。
継承してより具体性の高いクラスを作らないと使用できない。
抽象メソッドは、メソッド名や受け取るパラメータ、返す値の型は書かれているが、処理ブロックは書かれていないメソッドのことである。継承したクラスで実装し、処理を記述する。
抽象メソッドを1つでも持つクラスは抽象クラスであり、クラス名の前にabstractをつける必要がある。
サブクラスにあるメソッドを必ず持たせたいという場合は、スーパークラスに抽象メソッドとして定義しておく。
例
Sample.java
public class Sample {
public static void main(String[] args) {
Praus p = new Praus("グレー");
p.drive(1.0);
p.drive(5.0);
p.drive(100.0);
}
}
Car.java
//抽象化クラスの定義
abstract public class Car {
double distance = 0.0; // 総走行距離
String color = "";
public Car(String color) {
this.color = color;
}
public void drive(double d) {
distance += d;
}
}
GasolineCar.java
abstract public class GasolineCar extends Car {
public GasolineCar(String color) {
super(color);
}
public void drive(double d) {
super.drive(d);
this.useGasoline(d);
}
// 抽象メソッドの定義
abstract void useGasoline(double d);
}
HybridCar.java
abstract public class HybridCar extends Car {
public HybridCar(String color) {
super(color);
}
public void drive(double d) {
super.drive(d);
this.useEnergy(d);
}
abstract void useEnergy(double d);
}
Praus.java
//抽象クラスの継承
public class Praus extends HybridCar {
public Praus(String color) {
super(color);
}
//抽象メソッドの実装
@Override
void useEnergy(double d) {
System.out.println(d + "km走行するための燃料を使いました。");
}
@Override
public void drive(double d) {
System.out.println("--------------------------------");
System.out.println(this.color + "のプラウスが走っています。");
super.drive(d);//親クラスであるHybridCarクラスのdriveメソッドが実行される
}
}
結果
--------------------------------
グレーのプラウスが走っています。
1.0km走行するための燃料を使いました。
--------------------------------
グレーのプラウスが走っています。
5.0km走行するための燃料を使いました。
--------------------------------
グレーのプラウスが走っています。
100.0km走行するための燃料を使いました。