コツコツ学習ブログ

プログラマのweb上のメモ的なもの

コンストラクタ

コンストラクタとは?

インスタンスが生成された直後に自動的に実行されるメソッドのこと。 インスタンス生成時(クラスがnewされた後)にJVMが自動的に呼び出しを行う

 コンストラクタの条件

  • メソッド名がクラス名と完全に等しい
  • メソッド宣言に戻り値が記述されていない(voidもNG)
public class クラス名
クラス名() {
自動的に実行する処理
}
}

コンストラクタのオーバーロード

同じ名前で引数が異なるメソッドを複数定義する オーバーロードは、コンストラクタでも可能

暗黙のコンストラク

javaでは、全てのクラスはインスタンス化に際して 1つ以上のコンストラクタ定義を持っていなければならない。

もしクラスにコンストラクタが一つも定義されていない場合は 引数なし、処理内容なしのコンストラクタがコンパイル時に自動追加される。

同一コンストラクタ内の別コンストラクタの呼び出しをJVMに依頼する

this(引数);

コンストラクタのオーバーロード(多重定義と)別コンストラクタの呼び出しの サンプルコード

Thief.java

public class Thief {
  String name;
  int hp;
  int mp;

  // コンストラクタ①
  public Thief(String name, int hp, int mp) {
    this.name = name;
    this.hp = hp;
    this.mp = mp;
  }

  // コンストラクタ②
  public Thief(String name, int hp) {
    // this.name = name;
    // this.hp = hp;
    // this.mp = 5;
    // ↓別コンストラクタの呼び出しでスマートにかける
    this(name, hp, 5);
  }

  // コンストラクタ③
  public Thief(String name) {
    // this.name = name;
    // this.hp = 40;
    // this.mp = 5;
    // ↓別コンストラクタの呼び出しでスマートにかける
    this(name, 40, 5);
  }
}
Main.java

public class Main {

    //引数がint型の場合、値渡しになる為メソッド内での代入は
    //呼び出し元へ影響しない
    public static void heal(int hp) {
        hp += 10;
    }

    //引数がクラス型の場合、変数tが示すアドレス
    //引数thiefにコピーされる参照渡しにより、t.hpと
    //thief.hpはメモリの同じ場所を差す事になる
    //その為thief.hpへの代入がt.hpに反映しているように見える
    public static void heal(Thief thief) {
        thief.hp += 10;
    }

    public static void main(String[] args) {
        int baseHp = 25;
        Thief t = new Thief("もえの", baseHp);
        System.out.println(baseHp + " : " + t.hp);
        heal(baseHp);
        heal(t);
        System.out.println(baseHp + " : " + t.hp);
    }
}