2016年12月23日金曜日

コンストラクタってなに? 2

Javaのコンストラクタが何かに関してはすでに説明しました。でも、わかりづらいと思ったのでもう一度説明します。

まず、コンストラクタがなにかというと、クラスからインスタンスが作成された際に、無条件で実行されるメソッドのことです。

例えば、以下のような勇者プログラムがあるとします。勇者を表すUserClassのインスタンスを作るたびに「勇者〜よ。よく来た。」という全く同じセリフを表示し、同時に勇者ごとにPowerパラメータの初期値ゼロを設定したいとします。こういうとき、インスタンスを作るたびに同じ動作を実行してくれるのがコンストラクタです。

public class Yuusha
{
  public static void main(String[] args)
  {
    UserClass myYuusha1 = new UserClass("ジョン");
    UserClass myYuusha2 = new UserClass("田中");
    UserClass myYuusha3 = new UserClass("すずき");
  }
}

public class UserClass
{
  private String message;
  private int power;
  public UserClass(String userName) //これがコンストラクタ
  {
    power = 0;
    message = "勇者" + userName + "よ。よく来た。";
    System.out.println(message);
  }
}

実行結果。

いちいちSystem.out.printlnメソッドをそれぞれに書かなくてもインスタンスを作るだけでそれぞれの勇者インスタンスの名前が表示されていることが実行結果からわかります。

もちろん、初期値もコンストラクタで書かれているとおり、ちゃんとゼロになっています。以下のようにプログラムを書き換えて実行すると。。。

public class Yuusha
{
  public static void main(String[] args)
  {
    UserClass myYuusha1 = new UserClass("ジョン");
    UserClass myYuusha2 = new UserClass("田中");
    UserClass myYuusha3 = new UserClass("すずき");
    System.out.println("現在の勇者ジョンのPowerは" + myYuusha1.getPower() + "です。");
  }
}

public class UserClass
{
  private String message;
  private int power;
  public UserClass(String userName) //これがコンストラクタ
  {
    power = 0;
    message = "勇者" + userName + "よ。よく来た。";
    System.out.println(message);
  }
  public int getPower()
  {
    return power;
  }
}

実行結果。ちゃんと初期値ゼロが入っています。

ちなみにコンストラクタも普通のメソッドと同じようにオーバーロードできます。

public class Yuusha
{
  public static void main(String[] args)
  {
    UserClass myYuusha1 = new UserClass("ジョン");
    UserClass myYuusha2 = new UserClass("田中");
    UserClass myYuusha3 = new UserClass("すずき");
    System.out.println("現在の勇者ジョンのPowerは" + myYuusha1.getPower() + "です。");
    UserClass myYuusha4 = new UserClass(); //String型の値を渡さない。
  }
}

public class UserClass
{
  private String message;
  private int power;
  public UserClass(String userName)
  {
    power = 0;
    message = "勇者" + userName + "よ。よく来た。";
    System.out.println(message);
  }
  public UserClass() //上と違って引数がない
  {
    power = 0;
    message = "名前が書かれていないぞ!";
    System.out.println(message);
  }
  public int getPower()
  {
    return power;
  }
}

実行結果。名前がない場合(String型のデータが渡されていない場合)は自動的に「名前が書かれていないぞ!」と表示。