コンストラクター
今まで作成したCarクラスは、オブジェクトを生成後に初期化して使用しました。もし、初期化せずに使用するとどうなるのでしょうか?ガソリンが0リッターなので、加速しても走りません。Carクラスには初期化メソッドが用意されており、Carクラスを利用する側が呼び出しの記述をしないと初期化されません。そこで、オブジェクトを生成した時に初期化をするように調整しましょう。そのようなときに利用できる仕組みが「コンストラクター」です。
コンストラクターは、クラスからインスタンス生成をする際にフィールド変数に値を設定するなどの初期設定を行う機能です。インスタンス生成を行う際に呼び出される特別なメソッドを記述します。
コンストラクター定義の書式 |
---|
アクセス修飾子 クラス名(仮引数リスト){ フィールドの初期化処理など } |
○ プログラム
次のようにCarクラスにコンストラクターを追加してください。
Car.java
- public class Car{
- //フィールド
- //public int speed; //スピード情報
- private int speed; //スピード情報(修正)
- //public double gas; //ガソリン情報
- private double gas; //ガソリン情報(修正)
- //コンストラクター
- public Car(){
- this(20);
- }
- public Car(double gas){
- this.speed = 0;
- this.gas = gas;
- }
- //メソッド
- //加速させるメソッド
- public void speedUp(int sp){
- //ガソリンを減らす
- this.gas -= sp / 10.0;
- if(this.gas < 0){ //ガソリンがマイナスになる場合
- //ガソリンを0に補正し、スピードを増やさない
- this.gas = 0;
- }else{
- //スピードを増やす
- this.speed += sp;
- }
- }
- //減速させるメソッド
- public void speedDown(int sp){
- //スピードを減らす
- this.speed -= sp;
- if(this.speed < 0){ //スピードがマイナスになる場合
- //スピードを0に補正する
- this.speed = 0;
- }
- }
- ////初期化を行うメソッド
- //public void init(double gas){
- // this.speed = 0;
- // this.gas = gas;
- //}
○ クラス図
○ 解説
10~12行目では、コンストラクターを定義しています。このコンストラクターは引数を受け取らず、呼び出されたらもう一つの引数を受け取るコンストラクターにガソリン量を表す「20」を渡して呼び出しています。
14~17行目では、引数を受け付けるコンストラクターを定義しています。スピード情報に「0」をセットし、ガソリン量を引数で受け取ったデータでセットします。
43~47行目では、コンストラクターを定義することにより初期化を行うメソッドが不要になったので、コメントアウト(削除)しています。
○ プログラム
コンストラクターが用意されたので、インスタンスを生成する記述も変更しましょう。
CarTest.java
- public static void main(String[] args) throws Exception{
- //インスタンスを生成する
- Car car = new Car(40);
- ////フィールド変数を初期化する
- //car.speed = 0;
- //car.gas = 20.0;
- car.init(20.0);
○ 解説
20行目では、フィールドを初期化するメソッドの呼び出しは廃止されたため、コメントアウトして実行させないようにしました。その代わりに用意されたコンストラクターで初期化をするために15行目では、インスタンス生成時の引数にガソリン量のデータを渡しています。
前節まではコンストラクターを定義していませんでした。しかし、インスタンス生成時に「new Car()」としていました。コンストラクターを定義していない場合は、引数なし・処理なしのコンストラクターが仮定されて、インスタンスが生成されます。なお、引数を持たないコンストラクターのことを「デフォルトコンストラクター」と呼びます。
今回のように引数を持つコンストラクターが1つでも定義されている場合は、デフォルトコンストラクターは仮定されません。デフォルトコンストラクターを使用したい場合は引数を持たないコンストラクターを明示的に定義しなくてはなりません。
なお、コンストラクターもオーバーロードさせることができます。コンストラクター内で同じクラスにある別のコンストラクターを呼ぶ場合は「Car.java」の11行目にあるように、コンストラクターの定義のブロックの最初に「 this()」のように記述をします。