Java - クラス・インスタンス生成 Part.2

# 記事の書かれ方について
授業スライドとかを参考にしてるわけじゃないので、別の切り口から説明されてると思うけど。
たぶん言ってることはあっている（はず）。

アドリブなのでミスがあるかもしれないのであったら教えて！

## 4部構成です
[Part.1 さっくりインスタンス生成をしてみる](https://qiita.com/okmt_okmt_/private/5801bc2930b54e9e6559)
[Part.2 コンストラクタを使ってもっとすっきり](https://qiita.com/okmt_okmt_/private/9b862a4a94aae00298fb) ←ｲﾏｺｺ
[Part.3 アクセス制御をして、入ってくる値を制限しよう](https://qiita.com/okmt_okmt_/private/ef595bb940c616785564)
[Part.4 クラス変数・メソッドを使ってみる](https://qiita.com/okmt_okmt_/private/f185ad6bc1a47fc1c0c6)

# つなぎ

Part.1では、デジタル学生証をクラスとして書いて、田中くんと野口くんの学生証をインスタンスとして作ってあげた。
今回もそのコードを使いまわしていく。

```java:DigitalStudentCard.java
class DigitalStudentCard{
  //学籍番号
  int num;

  //お名前
  String name;

  //出力する用のメソッド（自己紹介してもらう)
  String getSelfIntroduction(){
    return "学籍番号 : " + num + " 名前 : " + name);
  }
}
```


```java
class UseClass{
  public static void main(String[] args){

    //インスタンス生成
    DigitalStudentCard tanaka = new DigitalStudentCard();

    //インスタンス変数へ代入
    tanaka.num = 118114;
    tanaka.name = "田中角栄";


    //別のインスタンスを生成
    DigitalStudentCard noguchi = new DigitalStudentCard();

    //新たに作ったインスタンスの変数へ代入
    noguchi.num = 118514;
    noguchi.name = "野口英世";

    //出力
    System.out.println(tanaka.getSelfIntroduction);
        // 学籍番号 : 118114 名前 : 田中角栄

    System.out.println(noguchi.getSelfIntroduction);
        // 学籍番号 : 118514 名前 : 野口英世
  }
}

```

今回はこれらのコードをもっとスマートに書くために<b>コンストラクタ</b>というものを使ってみよう。

# コンストラクタとはなんじゃろな？
コンストラクタは<b>インスタンスが生成されるときに1回だけ呼ばれるメソッド</b>のこと。
Processingの`void setup()`関数がアプリの起動時に一度だけ実行される関数であったようにこいつもそんな感じ。

インスタンスを生成するときに、一緒に値をぶち込みたいな～とか思ったときに使う。

#書いてみる
`DigitalStudentCard`にコンストラクタを追加してみる。
後から入れるのはめんどくさいので、インスタンス生成するときに`num`と`name`を設定できるように

<b>コンストラクタはクラスの名前をそのままベーっと書く</b>ことで実装できる。
引数を受け取りたければ、メソッドと同じように仮引数を書いてやればよい。

```java:DigitalStudentCard.java
class DigitalStudentCard{
  //学籍番号
  int num;

  //お名前
  String name;

  //コンストラクタ
  DigitalStudentCard(int num, String name){
    //引数のnumをインスタンスのnum(this.num)へ代入
    this.num = num;

    //同じく
    this.name = name;
  }

  //出力する用のメソッド（自己紹介してもらう)
  String getSelfIntroduction(){
    return "学籍番号 : " + num + " 名前 : " + name);
  }
}
```

こいつを使うときは、`new DigitalStudentCard()`のところで引数を与える。

```java
class UseClass{
  public static void main(String[] args){

    //インスタンス生成
    DigitalStudentLicense tanaka = new DigitalStudentCard(118114, "田中角栄");

    //別のインスタンスを生成
    DigitalStudentLicense noguchi = new DigitalStudentCard(118514, "野口英世");

    //出力
    System.out.println(tanaka.getSelfIntroduction);
        // 学籍番号 : 118114 名前 : 田中角栄

    System.out.println(noguchi.getSelfIntroduction);
        // 学籍番号 : 118514 名前 : 野口英世
  }
}

```

コンストラクタを使うことで、さらにコードを短くすることができた。

## ちなみに
コンストラクタはメソッド同様にオーバーロードできるので、複数書いて処理を分岐させることができる。

```DigitalStudentCard.java
class DigitalStudentCard{
  //学籍番号
  int num;

  //お名前
  String name;

  //コンストラクタ
  DigitalStudentCard(int num, String name){
    //引数のnumをインスタンスのnum(this.num)へ代入
    this.num = num;

    //同じく
    this.name = name;
  }

  DigitalStudentCard(){
    //Part.1と同様の使い方もできるようにする。
  }

  //出力する用のメソッド（自己紹介してもらう)
  String getSelfIntroduction(){
    return "学籍番号 : " + num + " 名前 : " + name);
  }
}
```

# 次回
次はアクセス修飾子をやっていくぞぅ！
つぎ → [Part.3 アクセス制御をして、入ってくる値を制限しよう](https://qiita.com/okmt_okmt_/private/ef595bb940c616785564)