Java 入門_第8章_「インスタンス」と「クラス」について

#はじめに
超ド級の初心者である私が、私自身解る様にまとめた**用語**と**解説集**である。
Java入門の-第8章-「インスタンス」と「クラス」とはどういう事か？どのように動いているか？
が、解る様にまとめている。

#仮想世界の作り方
- **オブジェクトを生み出す手順**
>①クラスを定義
>②そのクラスに基づいて、オブジェクトを生成する。

- クラスとオブジェクトは、全く違うものである。

- `仮想世界で活躍する`のは、**「インスタンス」**である。

- **オブジェクト**
時々クラスのことを指して使われることもある**曖昧**なもの。

- **インスタンス**
金型（クラス）ではなく、その型から生み出された仮想世界で活躍する実体を厳密に示すもの。

- **インスタンス化**
クラスからインスタンスを生成することをいう。

- **[インスタンスとクラスの関係]**
仮想世界で活躍するのは、**「インスタンス」**であり、そのインスタンスを生み出す為の金型が、**「クラス」**である。


#プログラムに登場する2つのクラス
>「登場人物クラス」
>「神様クラス」
※プログラムを作成していく上で、この2種のクラスが、必要である。

#クラスの定義方法
####**[概要]**
- 「クラスの宣言」
- 「属性の宣言」
- 「定数フィールド」
- 「this」
- 「メンバ」


######**クラスの宣言**

```Hero.java
1   public class Hero {
2   }
```

######**属性の宣言(フィールド)**

```Hero.java
1   public class Hero {
2       String name;
3       int hp;
4   }
```
- **フィールド**
`クラスブロック内の中`に**宣言**された**変数**をいう。

- **フィールドの宣言**
属性を宣言するには、`クラスブロックの中`に**変数宣言**を記述する。

※**「name」**と**「hp」**が、**フィールド**である。

######**定数フィールド**
フィールド宣言の先頭に**final**を付ける。finalを付ける事によって、`値を書き換えできない`様にする。

```teisuu.java
1   public class Matango {
2       int hp;
3       final int LEVEL = 10;
```

######**this**
`「自分自身」`の**インスタンス**を意味している。

- ドット「.」は、「の」と同じ意味。

```Matango.java
1   public class Matango {
2       int hp;
3       void sleep() {
4           this.hp = 100;
5           System.out.println( this.name + "は、眠って回復した！");
6
```
```Matango.java
 this.hp = 100;
```
- **自分自身のインスタンスのhpフィールドに値100を代入**という意味。

- **thisは、省略しない。**
予想外の動作が起きる場合がある。フィールドを用いる際は、明示的にthisを付ける。

######**メンバ**
クラスの中にいる要素で、`「フィールド」`と`「メソッド」`の事である。

#クラス定義
>①そのクラスに基づいて、**インスタンスを生成**できるようになる。
>②そのクラスから生まれた**インスタンスを入れる変数の型**が利用可能になる。
例）　Heroクラスを定義　→　Hero型の変数が利用できる。

- **クラス型**
クラスを定義することで、利用可能になる**型**。
※クラス型変数を準備する方法は、int型やString型と同じ。
例）　**Hero(クラス型) h（変数） =　100（値）;**

- **インスタンス**は、通常**クラス型変数**に入れて利用する。
例） **Hero h ;**

- **クラス型変数を用いる理由**
仮想世界内に、複数存在しうる同名インスタンスの中から、特定の1つのインスタンスをプログラム的に識別する為である。

#神様クラスの作り方（mainメソッドを持ったクラス）
- 神様クラスとは、**mainメソッドを持ったクラス**のことである。
- mainメソッドは、**プログラムを実行させる**際に、使用するメソッドである。
（Heroクラス等、他クラスで作成したプログラムは、mainメソッドを使う事で、動作する）

```Main.java
public static void main(String[] args) {
```

####**[概要]**
- 「インスタンスの生成」
- 「フィールドへの値の代入」
- 「インスタンスのメソッドの呼び出し」


######**インスタンスの生成**
- **[ クラス名　変数名　=　new　クラス名（　）; ]**
例）　**Hero h = new ( );**

- インスタンスを生成しているのは、**右辺の「new Hero( )」**という部分であり、「=」によって生成した**インスタンスを型変数に代入**している。

######**フィールドへの値の代入**
- **[ 変数名 . フィールド名　=　値 ; ]**

```Main.java
h.name = "ミナト";
```

- 勇者 h のフィールドに値を代入する文法
P.319 リスト8-12参照

```Hero.java
1   public class Hero {
2       String name;
3       int hp;
4       void attack();
5       void run();
```

```Main.java
1   public class Main {
2       public static void main (String[] args) {
3           Hero h = new Hero () ;
4           h.name = "ミナト"  ;  
5           h.hp = "100" ;
6           System.out.println("勇者" + h.name + "を生み出しました！");
7       }
8   }
```

Mainクラスの**「h.name = "ミナト";」**の説明 

- h は、Hero h の 「 h 」。Hero型の変数「 h 」である。

- name は、Heroクラスで定義した**フィールド**である。

- "ミナト"は、**値**である。

######**インスタンスのメソッドの呼び出し**
- **[ 変数名 . メソッド名（ ） ]**

```Method.java
h.sit(5);
h.slip();
h.sit(25);
h.run();
```
- h は、Hero型 h の **h(変数)**。
- sit, slip, sit, runは、**メソッド名**。
- 引数に渡された、「5」や「25」は、**値** 。

#簡単にまとめると
- インスタンスの生成には、「new」を使う。
- フィールドを利用する場合は、「変数名 . フィールド名」
- メソッドを呼び出す場合は、「変数 . メソッド名( )」     

#まとめ
Java入門-第8章-の「インスタンス」と「クラス」とはどういう事か？また、どのように動いているか？が解る様に作成した。

#参考文献
スッキリわかるJava入門-第2版-　株式会社インプレス出版　中山清喬/国本大悟・著