抽象クラス
ポリモーフィズムを実現させるにはいくつかの方法があります。ここでは、抽象クラスについて学習しましょう。抽象クラスは、抽象メソッドを含むクラスです。抽象メソッドとは、処理を定義していないメソッド、つまり、メソッド名、引数リスト、戻り値の型のみ宣言されているメソッドです。抽象メソッドは「abstract」キーワードをつけて宣言します。
抽象メソッド定義の書式 |
---|
abstract 戻り値の型 メソッド名(引数リスト); |
抽象メソッドを持つクラスは具現化しないと使えないため、クラスに「abstract」キーワードをつける必要があります。それにより、抽象クラスとします。
抽象クラス定義の書式 |
---|
abstract class クラス名{ 各種定義… } |
抽象クラスはインスタンスを生成できません。別のクラスで継承し、抽象メソッドをオーバーライドして利用することができるようになります。
○ ファイル
次のようにファイルを作成してください。
ファイル名 | Vehicle.java |
---|
○ プログラム
抽象クラスを作成しましょう。今回は乗り物を表すクラスを作成します。今まで作成したCarクラスを乗り物(Vehicle)クラスとして、加速処理部分を抽象化したクラスを作成することとします。これにより加速部分はそれぞれの種類の乗り物によって定義することになります。Vehicleクラスを追加して、次のようにプログラムを記述してください。
Vehicle.java
- abstract class Vehicle{
- //フィールド
- protected int speed;
- protected double gas;
- //コンストラクター
- public Vehicle(){
- this(20);
- }
- public Vehicle(double gas){
- this.speed = 0;
- this.gas = gas;
- }
- //メソッド
- //加速するメソッド(抽象メソッド)
- public abstract void speedUp(int sp);
- //減速するメソッド
- public void speedDown(int sp){
- //スピードを減らす
- this.speed -= sp;
- if(this.speed < 0){ //スピードがマイナスになる場合
- //スピードを0に補正する
- this.speed = 0;
- }
- }
- //getter
- public int getSpeed(){
- return this.speed;
- }
- public double getGas(){
- return this.gas;
- }
- }
○ クラス図
○ 解説
17行目では、抽象メソッドを宣言しています。メソッドの仕様は決まっているので、このメソッドを使用するにはオーバーライドして処理を実装する必要があります。抽象メソッドが含まれるために1行目のクラスの宣言に「abstract」キーワードがついており、抽象クラスとして作成しています。
○ ファイル
次のようにファイルを作成してください。
ファイル名 | SportsCar.java |
---|
○ プログラム
乗り物クラスを継承したスポーツカークラスを作成しましょう。
SportsCar.java
- public class SportsCar extends Vehicle{
- //フィールド
- public final int MAXSPEED = 300; //最大スピード
- public final double MAXFUEL = 60; //ガソリンタンク容量
- //コンストラクタ
- public SportsCar(double gas){
- super(gas);
- //ガソリン量が容量を超える場合は最大容量をガソリン量にセット
- if(this.gas > MAXFUEL){
- this.gas = MAXFUEL;
- }
- }
- //メソッド
- public void speedUp(int sp){
- //ガソリンを減らす
- this.gas -= sp / 10.0;
- if(this.gas < 0){ //ガソリンがマイナスになる場合
- //ガソリンを0に補正し、スピードを増やさない
- this.gas = 0;
- }else{
- //スピードを増やす
- this.speed += sp;
- if(this.speed > MAXSPEED){
- this.speed = MAXSPEED;
- }
- }
- }
- }
○ クラス図
○ 解説
3行目と4行目では、最大スピードと、ガソリンタンク容量を定数として宣言しています。
7~13行目では、コンストラクターを定義しています。このコンストラクターはガソリン量を受けとって、スーパークラスのコンストラクターを呼び出し、ガソリン量をセットしています。そのあと、ガソリンタンク容量と比較して、セットしたガソリン量が多ければ最大容量をセットするという処理をします。
16~29行目では、speedUpメソッドをオーバーライドしています。抽象クラスを継承すると、抽象メソッドは強制的にオーバーライドしなければなりません。今回は加速するときに、消費するガソリン量がない場合は加速しない、最大スピードに達していた場合はそれよりスピードが出ないようにしています。
○ ファイル
次のようにファイルを作成してください。
ファイル名 | SportsCarTest.java |
---|
○ プログラム
SportsCarクラスを利用するプログラムを作成しましょう。次のように記述してください。
SportsCarTest.java
- import java.io.*;
- public class SportsCarTest{
- //車の状態を表示するメソッド
- public static void showMeter(SportsCar car){
- //各フィールドの内容を表示する
- System.out.println("スピード:" + car.getSpeed() + "km/h");
- System.out.println("ガソリン:" + car.getGas() + "L");
- }
- public static void main(String[] args) throws Exception{
- //インスタンス生成
- SportsCar car = new SportsCar(60);
- //状態を表示
- showMeter(car);
- //キーボード入力の準備
- BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
- while(true){
- //操作を入力
- System.out.print("1)加速 2)減速 9)終了:");
- String inputdata = br.readLine();
- //操作によって分岐する
- switch(inputdata){
- case "1":
- //加速する
- car.speedUp(10);
- showMeter(car);
- break;
- case "2":
- //減速する
- car.speedDown(5);
- showMeter(car);
- break;
- case "9":
- //プログラムを終了する
- return;
- default:
- showMeter(car);
- break;
- }
- }
- }
- }
○ コンパイルと実行
C:¥work>javac SportsCarTest.java
C:¥work>java SportsCarTest
スピード:0km/h
ガソリン:60.0L
1)加速 2)減速 9)終了:1
スピード:10km/h
ガソリン:59.0L
1)加速 2)減速 9)終了:9
C:¥work>
○ 解説
30行目では、SportsCarオブジェクトのspeedUpメソッドを呼び出しています。このメソッドはSportsCarクラスでオーバーライドされています。それにより、SportsCarで定義されているspeedUpが実行されます。