Developer

【はじめてのJava】コンストラクタ【オブジェクトとクラス編】
2021.06.28
Lv1

【はじめてのJava】コンストラクタ【オブジェクトとクラス編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


オブジェクトとクラス編

オブジェクトとクラス編では、Javaを扱う上で非常によく出てくる「オブジェクト」や「クラス」について扱っていきます。

前回は「オーバーロードの注意点」について扱いました。

今回は「コンストラクタ」について扱います。


目次


コンストラクタ

 コンストラクタ は一般にメソッドの一種と言われますクラスのインスタンス化の際に動作するもので、オブジェクトの初期化を行います

具体的に見ていきましょう。


コンストラクタとは

コンストラクタはクラスをインスタンス化する際に動き、そのインスタンスの初期設定などを行います。

以前作成したCarクラスを例に見ていきましょう。

以前作成したCarクラスは、以下のようになっています。

Carクラス

class Car{
  double speed;
  String color;

  void accell(){
    speed += 10;
  }

  //↓オーバーロードしたaccellメソッド
  void accell(int s){
    if(s < 0){
      //sが負の数だった場合、メソッドの処理を終了する
      return;
    }
    speed +=s;
  }

}

このCarクラスをインスタンス化する場合、以下のように記載しました。

MyCarDriveクラスのCarクラスのインスタンス化の箇所(該当箇所のみ抜粋)

Car myCar = new Car();

これを図にすると以下の通りです。

作成したてのCarクラスはspeedは0km/h、colorはありません。

これでも問題ないと言えば問題ありません。

しかし、実際の車は、作成した瞬間に色が存在しないということは考えづらいです。完成した際にはすで色が決まっていることがほとんどです。

これをJavaに置き換えると、インスタンス化と同時にcolorの値が決まればよいことになります。

このような、 インスタンス化の際に初期値を決める(初期化処理を行う)のがコンストラクタ です。


コンストラクタの書き方

コンストラクタは、インスタンス化の時にのみ動作する特別なメソッドです。

ですので、書き方はメソッドに似ています。ただし、通常のメソッドよりも決まりごとが多くあります。

コンストラクタの書き方は以下の通りです。

/* クラス名 */(/* 引数 */){
  //初期化の内容
}

引数や処理内容を記述する部分は通常のメソッドと同様です。

ただし、コンストラクタの書き方は通常のメソッドの書き方と比べて以下の点が異なります。

  • 戻り値は記載しない
  • メソッド名はクラス名と同じものにする

コンストラクタはインスタンス化の時に自動的に動きますが、それ以降は動きません。そのため、戻り値を考える必要がありません。

もし、戻り値を記載してしまった場合、通常のメソッド扱いになり、コンストラクタではなくなります

また、コンストラクタの識別子は大文字小文字も含めてクラス名と完全に一致させます。少しでも異なるとコンストラクタではなくなります。


Carクラスのコンストラクタを作成する

Carクラスを例にコンストラクタの作成方法を見てみましょう。

Carクラスのコンストラクタは以下のようになります。

Car(/* 引数 */){
  //初期化の内容
}

このコンストラクタを利用して、インスタンス化と同時にcolorがredに設定されるようなCarクラスにしてみましょう。

イメージは以下の通りです。

この場合、コンストラクタには以下のように記載します。

Car(){
  this.color = "red";
}

thisは「自分自身の」という意味合いだと思ってください。thisについては記述しなくてもOKですが、後々記載していたほうが都合が良くなります。

上記を先ほどのCarクラスに記述すると、全体像は以下の通りになります。

class Car{
  double speed;
  String color;

  //↓コンストラクタ
  Car(){
    this.color = "red";
  }

  void accell(){
    speed += 10;
  }

  //↓オーバーロードしたaccellメソッド
  void accell(int s){
    if(s < 0){
      //sが負の数だった場合、メソッドの処理を終了する
      return;
    }
    speed +=s;
  }

}

これで、コンストラクタによって、インスタンス化時に自動的にcolorがredに設定されるようになりました。


動作確認

では、実際に動作確認してみましょう。

MyCarDriveクラスを作成し、Carクラスをインスタンス化して確かめてみましょう。

MyCarDriveクラスは以下の通りです。

MyCarDrive

public class MyCarDrive{
  public static void main(String[] args){

    Car myCar = new Car();

    //↑でインスタンス化したのみで、他に何も操作を行わない
    System.out.println(myCar.color); //myCarのcolorを確認

  }
}

インスタンス化以外は何もしないままmyCarのcolorを表示しています。

実行結果は下の通りです。

インスタンス化以外の操作を行っていませんが、確かにmyCarのcolorがredに設定されていることが確認できます。


ソースコード

今回使用したソースコードをまとめて記載します。2つのソースコードは同じディレクトリに配置する必要があります。

Car.java
※間違っていたため修正しました。(2021年7月17日 16:00)

class Car{
  double speed;
  String color;

  //↓コンストラクタ
  Car(){
    this.color = "red";
  }

  void accell(){
    speed += 10;
  }

  //↓オーバーロードしたaccellメソッド
  void accell(int s){
    if(s < 0){
      //sが負の数だった場合、メソッドの処理を終了する
      return;
    }
    speed +=s;
  }

}

MyCarDrive.java

public class MyCarDrive{
  public static void main(String[] args){

    Car myCar = new Car();

    //↑でインスタンス化したのみで、他に何も操作を行わない
    System.out.println(myCar.color); //myCarのcolorを確認

  }
}

まとめ

インスタンス化と同時に行いたい処理(初期化処理)がある場合はコンストラクタを作成する。
コンストラクタの実行されるタイミングはインスタンス化の時のみである。
コンストラクタに戻り値は記載しない。
コンストラクタの名称は大文字小文字も含めてクラス名と一致させる。

次回

次回は引数付きのコンストラクタについて扱います。


はじめてのJavaシリーズの目次はこちら
オブジェクトとクラス編はこちら


java 11 の練習問題一覧はこちら
はじめてのJavaシリーズの練習問題一覧はこちら