Java学習メモ２　コンストラクタ

# 概要
[Java学習メモ1 インスタンス](https://qiita.com/iwhg0211/items/2c624178f183573ba797)の続きです。
間違いがあったら教えてください。

# 目次
- コンストラクタ

# コンストラクタ
newでインスタンスを作成した後に、自動で呼び出される（自動で処理がされる？）特別なメソッドのこと
1. クラス名と同じ名前にする
1. 戻り値やvoidを書いてもいけない

この２つを守らなければなりません。」

new インスタンス名();でインスタンスを生成する際、()には引数を渡すことができます。
(インスタンスの生成とともに呼び出してくれるものだから、「newで生成した際に、コンストラクタに渡したい値をセッ」ト→「コンストラクタにその値を受け取る準備をする」)
そして、その引数はコンストラクタに受け渡すことができます。

```Main.java
class Main {
  public static void main(String[] args) {
    Person person1 = new Person("Kate", "Jones", 27, 1.6, 50.0);
    
    System.out.println(person1.firstName);
    System.out.println(person1.lastName);
    System.out.println(person1.age);
    System.out.println(person1.height);
    System.out.println(person1.weight);
  }
}
```

```Person.java
class Person {
  public String firstName;
  public String lastName;
  public int age;
  public double height;
  public double weight;

//以下、コンストラクタPersonに、Main.javaで引数に設定した"Kate", "Jones", 27, 1.6, 50.0
//を受け取るためにString firstName, String lastName, int age, double height, 
//double weightを記述する
  Person(String firstName, String lastName, int age, double height, double weight){
//以下の記述を忘れない
    this.firstName = firstName;
    this.lastName = lastName;
    this.age = age;
    this.height = height;
    this.weight = weight;
  }
  
}
```

### インスタンスメソッドを作成

上記の記述に付け加えをしていきます。
Person.javaにfullNameメソッド、bmiメソッドを付け加えていきます。

その際、インスタンスメソッドの作成なので、「public データ型 インスタンス名」

```Main.java
class Main {
  public static void main(String[] args) {
    Person person1 = new Person("Kate", "Jones", 27, 1.6, 50.0);
    
//以下、MainクラスでfullNameメソッドと、bmiメソッドの呼び出しをする
    System.out.println(person1.fullName());
    System.out.println(person1.age);
    System.out.println(person1.bmi());
  }
}
```

```Person.java
class Person {
  public String firstName;
  public String lastName;
  public int age;
  public double height;
  public double weight;

  Person(String firstName, String lastName, int age, double height, double weight){
    this.firstName = firstName;
    this.lastName = lastName;
    this.age = age;
    this.height = height;
    this.weight = weight;
  }

//以下、fullNameメソッド内で、インスタンスフィールドのfirstName,lastNameを呼び出す。
//インスタンスメソッド内から、インスタンスフィールドを呼び出すのでthisをつける
  public String fullName(){
    return this.firstName + "" + this.lastName;
  }

  public double bmi(){
    return this.weight / this.height / this.height;
  }
  
}
```

### 他のインスタンスメソッドを呼び出す

インスタンスメソッドでインスタンスメソッドを呼び出します。
fullNameメソッドやbmiメソッドを呼び出せるprintDataメソッドをPersonクラスに記述します。

```Main.java
class Main {
  public static void main(String[] args) {
    Person person1 = new Person("Kate", "Jones", 27, 1.6, 50.0);
    person1.printData();
    
    Person person2 = new Person("John", "Smith", 65, 1.75, 80.0);
    person2.printData();    
    
  }
}
```

```Person.java
class Person {  
  
  public String firstName;
  public String lastName;
  public int age;
  public double height, weight;

  Person(String firstName, String lastName, int age, double height, double weight) {
    
    this.firstName = firstName;
    this.lastName = lastName;
    this.age = age;
    this.height = height;
    this.weight = weight;
  }

  public String fullName() {
    return this.firstName + " " + this.lastName;
  }

  public double bmi() {
    return this.weight / this.height / this.height;
  }
  
  public void printData() {
    //↑printDataメソッドには戻り値がないので、public void メソッド名にしている
    //voidは戻り値がないという意味
    System.out.println("私の名前は" + this.fullName() + "です");
    System.out.println("年齢は" + this.age + "歳です");
    System.out.println("BMIは" + Math.round(this.bmi()) + "です");
  }
}
```