Java学習メモ　１　インスタンス

# 概要
プログラミングスクールを卒業して、転職活動中にProgateで主にJava、 MySQLを学習しています。
その際に、苦戦したところ、理解するために自分用のまとめとして書きます。

間違っていたらご指摘いただけると幸いです。

# 目次
- インスタンス
- インスタンスメソッド
- インスタンスフィールド

# インスタンス
オブジェクトとも言われる。クラスと言うインスタンスの設計図をもとに作成される。

主に、インスタンスで作成するのは
・インスタンスフィールド（インスタンスの情報）
・インスタンスメソッド（インスタンスの動作）

この２つを、インスタンスのクラスに記述していき、メインメソッドで呼び出すイメージ。

### インスタンスの生成
インスタンスを作成する際は

```Progate:ターミナル
new クラス名();
```

これで作成する。例えば、Mainクラスの他に、Personクラスを作ったならば、
```Main.java
class Main{
    public static void main (String[] args) {
        new Person();
        //インスタンスの作成
    }
}
```

```Person.java
class Person{
    
}
```

と作り始める。
これでMainクラスの方でPersonというインスタンスができ、PersonクラスでPersonの詳細を作成する準備ができた。

### インスタンスを変数に代入する
作成したnew クラス名();のインスタンスは変数に代入することができる。

```Main.java
クラス型 変数 = new クラス名();
```

例えば、Personクラスのインスタンスを、新たに設定する変数person1に入れようとするときは、

```Main.java
class Main{
    public static void main (String[] args){
        Person person1 = new Person();  //クラス型 変数 = new クラス型()
    }
}
```

これで代入完了。

ちなみに、
```Main.java
class Main{
    public static void main (String[] args){
        Person person1 = new Person();
        Person person2 = new Person();
        Person person3 = new Person();
    }
}
```
とすることで、インスタンスを複数作成することができる。


# インスタンスメソッド
インスタンスの動作である、インスタンスメソッドを作成します。
インスタンスのメソッド名を記述して、メインメソッドで呼び出す。

```インスタンス.java
public void インスタンスメソッド名() {
    System.out.println("出力したい文章");
}
```

```Main.java
インスタンス（もしくはインスタンスを代入した変数）.インスタンスメソッド名();
```

これだけではわかりづらいので、実際にPersonクラスで指定したhelloメソッドを、メインメソッドで呼び出す際の記述を下に書きました。


```Main.java
class Main{
    public static void main (String[] args){
        Person person1 = new Person();
        Person person2 = new Person();
        person1.hello();  //変数(インスタンス名).メソッド名();
        person2.hello();
    }
}
```

```Person.java
class Person{
    public void hello() {  //public void メソッド名();
        System.out.println("こんにちは");
    }
}
```

これでPersonクラスにある、helloメソッドを、Mainクラスで呼び出すことができます。

# インスタンスフィールド
次にインスタンスの情報である、インスタンスフィールドを作成していきます。
インスタンスフィールドは情報を格納しておく変数といえるとのこと。(Progate様の説明より)

変数を設定する際はクラスの一番上に置くことも大事。
実際にPersonクラスに名前を入れるインスタンスフィールド（変数name）を設定します。

```Person.java
class Person{
    public String name;
  //public データ型 フィールド名;
}
```

書き方は
```
    public データ型 フィールド名;
```

で記述します。

### インスタンスフィールドへのアクセス
基本的にMainメソッドでインスタンスフィールドにアクセスしていく。

```Main.java
class Main{
    public static void main (String[] args){
        Person person1 = new Person();
        person1.name = "田中";

        System.out.println(person1.name);
    }
}
```

```Person.java
class Person{
    public String name;
}
```

これで、「田中」と出力できます。

複数作ることが可能。

```Main.java
class Main{
    Person person1 = new Person();
    Person person2 = new Person();
    Person person3 = new Person();

    person1.name = "田中";
    person2.name = "藤田";
    person3.name = "杉浦";

    System.out.println(person1.name);
    System.out.println(person2.name);
    System.out.println(person3.name);
}
```

```Person.java
class Person {
    public String name;
}
```

### インスタンスメソッドの中からインスタンスフィールドにアクセス

インスタンスメソッド内からインスタンスフィールドにアクセスする際には、thisという変数を使います。
なくてもできたりしましたが、上記の場合にはしっかりつかいましょう。

```Main.java
class{
    Person person1 = new Person();
    person1.name = "田中";
    //インスタンスフィールドへのアクセス
    person1.hello();
    //インスタンスメソッドの呼び出し
}
```

```Person.java
class Person{
    public String name;
    //インスタンスフィールド

    public void hello(){
    //インスタンスメソッド
        System.out.println("私の名前は"+ this.name +"です");
    }
}
```

また、thisはメソッドが呼び出された際に、呼び出したインスタンスの代わりをします。
これだけだと意味がわかりづらいので、実際に例を挙げます。

```Main.java
class{
    Person person1 = new Person();
    person1.name = "田中";
    //インスタンスフィールドへのアクセス
    person1.hello();
    //インスタンスメソッドの呼び出し
}
```

```Person.java
class Person{
    public String name;
    //インスタンスフィールド

    public void hello(){
    //インスタンスメソッド
        System.out.println("私の名前は"+ this.name +"です");
    }
}
```
上記で言うと、person1というインスタンスがhelloというインスタンスメソッドを呼び出していますね。(person1.hello();の箇所ですね)
そのため、helloメソッドの中では、呼び出し元のperson1というインスタンスをthisで表しています。