コンストラクタ

 今まで作成したCarクラスは、オブジェクトを生成後に初期化して使用してもらいました。もし、初期化せずに使用するとどうなるのでしょうか?ガソリンが0リッターなので、加速しても走りません。Carクラスには初期化メソッドが用意されており、Carクラスを利用する側が呼び出しの記述をしないと初期化されません。そこで、オブジェクトを生成した時に初期化をするように調整しましょう。そのようなときに利用できる仕組みが「コンストラクタ」です。

 コンストラクタは、クラスからインスタンス生成をする際にフィールド変数に値を設定するなどの初期設定を行う機能です。インスタンス生成を行う際に呼び出される特別なメソッドを記述します。

コンストラクタ定義の書式
アクセス修飾子 クラス名(仮引数リスト){
 フィールドの初期化処理など
}

サンプルダウンロード

○ プログラム

 次のようにCarクラスにコンストラクタを追加してください。

Car.java

  1. public class Car{
  2.  //フィールド==========
  3.  //public int speed;     //スピード情報
  4.  private int speed;     //スピード情報(修正)
  5.  //public double gas;     //ガソリン情報
  6.  private double gas;     //ガソリン情報(修正)
  7.  //コンストラクタ==========
  8.  public Car(){
  9.   this(20);
  10.  }
  11.  public Car(double gas){
  12.   this.speed = 0;
  13.   this.gas = gas;
  14.  }
  15.  //メソッド==========
  16.  //加速させるメソッド
  17.  public void speedUp(int sp){
  18.   //ガソリンを減らす
  19.   this.gas -= sp / 10.0;
  20.   if(this.gas < 0){     //ガソリンがマイナスになる場合
  21.    //ガソリンを0に補正し、スピードを増やさない
  22.    this.gas = 0;
  23.   }else{
  24.    //スピードを増やす
  25.    this.speed += sp;
  26.   }
  27.  }
  28.  //減速させるメソッド
  29.  public void speedDown(int sp){
  30.   //スピードを減らす
  31.   this.speed -= sp;
  32.   if(this.speed < 0){     //スピードがマイナスになる場合
  33.    //スピードを0に補正する
  34.    this.speed = 0;
  35.   }
  36.  }
  37.  ////初期化を行うメソッド
  38.  //public void init(double gas){
  39.   // this.speed = 0;
  40.   // this.gas = gas;
  41.  //}

○ クラス図

○ 解説

 10~12行目でコンストラクタを定義しています。このコンストラクタは引数を受け取らず、呼び出されたらもう一つの引数を受け取るコンストラクタにガソリン量を表す「20」を渡して呼び出しています。

 14~17行目では引数を受け付けるコンストラクタを定義しています。スピード情報に「0」をセットし、ガソリン量を引数で受け取ったデータでセットします。

 43~47行目では、コンストラクタを定義することにより初期化を行うメソッドが不要になりましたので、コメントアウト(削除)しています。

Run1.java

  1. public static void main(String[] args) throws Exception{
  2.  //インスタンスを生成する
  3.  Car car = new Car(40);
  4.  ////フィールド変数を初期化する
  5.  //car.speed = 0;
  6.  //car.gas = 20.0;
  7.  //car.init(20.0);

○ 解説

 20行目で、フィールドを初期化するメソッドの呼び出しは廃止されたため、コメントアウトして実行させないようにしました。その代わりに用意されたコンストラクタで初期化をするために15行目では、インスタンス生成時の引数にガソリン量のデータを渡しています。

 前節まではコンストラクタを定義していませんでした。しかし、インスタンス生成時に「new Car()」としていました。コンストラクタを定義していない場合は、引数なし・処理なしのコンストラクタが仮定されて、インスタンスが生成されます。なお、引数を持たないコンストラクタのことを「デフォルトコンストラクタ」と呼びます。

デフォルトコンストラクタのイメージ
デフォルトコンストラクタのイメージ

 今回のように引数を持つコンストラクタが1つでも定義されている場合は、デフォルトコンストラクタは仮定されません。デフォルトコンストラクタを使用したい場合は引数を持たないコンストラクタを明示的に定義しなくてはなりません。

デフォルトコンストラクタは仮定されない
デフォルトコンストラクタは仮定されない

 なお、コンストラクタもオーバーロードさせることができます。コンストラクタ内で同じクラスにある別のコンストラクタを呼ぶ場合は「Car.java」の11行目にあるように、コンストラクタの定義のブロックの最初に「 this()」のように記述をします。

前へ   次へ