【初心者向け】javaのコンストラクタについてまとめ


#####コンストラクタとは
コンストラクタとは、newで生み出されたインスタンスに自動で情報（フィールド)を渡してくれるものです。


```php

public class Hero {
	String name;
	int hp;
}
```
このHeroクラスをインスタンス化すると、値の入っていないHero（nameがnullでhpが0）が生成されてしまいますが


```php
public class Hero {
	String name;
	int hp;

	//コンストラクタ
	Hero(){
		this.name = "名前";
		this.hp = 100;
	}
}
```
こうすることによって値をフィールドに代入できます。
でもこれだと同じ名前と同じＨＰのHeroしか作ることができません。
魔法使いＨＰ５０とか、妖精ＨＰ７０とかが作れないのです。
なので、自由にキャラクターを作れるようにするためにこのようにします。

```php
public class Hero {
		String name;
		int hp;

		//コンストラクタ
		Hero(String name , int hp){
			this.name = name;
			this.hp = hp;
		}
}
```

これは何をしているかというと、Hero(String name , int hp)でnameとhpを受け取って、フィールドに代入しているのです。
どこから受け取っているのかというと、mainメソッドから受け取っています。


```php
public static void main(String[] args) {
		Hero h = new Hero("勇者" , 100);
	}

```

Heroクラスで引数を２つ受け取るコンストラクタを設定したので、呼び出すときも引数を２つ設定して呼び出します。
これが引数１つだとエラーになります。

結果はこうなります。
ちゃんと値が渡されているか確認しましょう。

```php
public static void main(String[] args) {
		Hero h = new Hero("勇者" , 100);
		System.out.println("名前は" + h.name + "です。");
		System.out.println("ＨＰは" + h.hp + "です。");
	}

```

結果は

```php
名前は勇者です。
ＨＰは100です。
```

ちゃんと渡すことができました。

でもこれだと、名前だけを渡したい場合エラーになってしまいます。

```php

public class Main {

	public static void main(String[] args) {
		Hero h = new Hero("勇者");//エラーになる
	}
}
```

こんな時はHeroメソッドにコンストラクタを追加します。

```php
public class Hero {
		String name;
		int hp;

		//コンストラクタ
		Hero(String name , int hp){   //ひとつ目のコンストラクタ
			this.name = name;
			this.hp = hp;
		}
		Hero(String name){   //ふたつ目のコンストラクタ
			this.name = name;   
			this.hp = 50;
		}
}

```

コンストラクタは、名前が同じでも、引数の数が違えば複数設定できるのです。
これをオーバーロードと言います。
もしmainメソッドでnewして呼び出すとき、引数にnameとhpがあったらひとつ目のコンストラクタが呼び出されます。
引数にnameだけがあったらふたつ目のコンストラクタが呼び出されます。
このままでもエラーにはなりませんが、渡されるフィールドが増えてきたりすると、修正や可読性が悪くなってしまいます。
なので


```php

this()
```

を使います。
これを使うと、同じメソッドにあるコンストラクタを呼び出すことができます。

```php

public class Hero {
		String name;
		int hp;

		//コンストラクタ
		Hero(String name , int hp){   //ひとつ目のコンストラクタ
			this.name = name;
			this.hp = hp;
		}
		Hero(String name){   //ふたつ目のコンストラクタ
			this(name , 50);
		}
}
```

こうなります。
ふたつ目のコンストラクタの中でひとつ目のコンストラクタを呼び出しているのです。
ひとつ目のコンストラクタは引数が２つあるのでthis()の()の中の引数は２つです。
nameはmainメソッドから渡されたものが入り、hpは渡されないので任意のhpを入れます。ここでは50としています。
これで実行すると

```php
public class Main {

	public static void main(String[] args) {
		Hero h = new Hero("勇者");
		System.out.println("名前は" + h.name + "です。");
		System.out.println("ＨＰは" + h.hp + "です。");
	}
}

```

結果



```php

名前は勇者です。
ＨＰは50です。
```

ちゃんと50が渡されてますね。
this()は結構ややこしいですね。ひとつずつ書いたほうが分かりやすいよ！と思ってる方もいると思いますが、そうすると後からフィールドを変更しなければならなくなった時大変になります。

```php
public class Hero {
		String name;
		int hp;

		//コンストラクタ
		Hero(String name , int hp){   //ひとつ目のコンストラクタ
			this.name = name;
			this.hp = hp;
		}
		Hero(String name){   //ふたつ目のコンストラクタ
			this.name = name;   
			this.hp = 50;
		}
}

```

こんなふうに書いていて、あとからフィールドを変更しなければならなくなると

```php

public class Hero {
		String name1;  //ここをname1に変更しなければならない。
		int hp;

		//コンストラクタ
		Hero(String name , int hp){   //ひとつ目のコンストラクタ
			this.name = name;  //エラーになる。
			this.hp = hp;
		}
		Hero(String name){   //ふたつ目のコンストラクタ
			this.name = name;  //エラーになる。
			this.hp = 50;
		}
}
```

この場合2か所直さないといけなくなります。
コンストラクタが２つならまだいいですが、これが増えてくると作業が大変になります。
なん十か所も直していたら一か所くらいミスが出てもおかしくありません。




自分がつまずいた部分だったのでまとめてみました。
間違いがありましたら指摘をお願いします。









nkojimaさんご指摘ありがとうございます。
記事の一部を削除しました。
確かに読み返してみたら可読性とは違いましたね。
送っていただいた記事も参考にさせていただきます。