筋トレ大好きな文系女学生のJava入門_静的メンバ

#はじめに
友人と話すのって本当に楽しいですよね〜 :sob: :joy: :heartbeat: :heartpulse: :sparkling_heart: :sparkling_heart: 
今日、３ヶ月ぶりに大学の友人と話して、大学４年間もっと仲良い友人と話しておけば良かったなと一瞬思ってしまいました・・・。笑
私ごとですが、友人と遊ぶのは年に２・３回ほどですからね。。。 ｗｗｗ

ではでは、今回は静的メンバについでです。
独学でやってるので、「これはJavaやっていくにあたって役に立つ知識だぞ！！」というのがあれば、コメントして頂けるととても嬉しいです :heart: :grey_exclamation:

##クラス上にあるフィールド
newによって生成される各インスタンスは、基本的に独立した存在である（***インスタンスの独立性***という)
前回の引き続き、MuscleBoyインスタンスが持つフィールドhpには、それぞれ別の値を入れることができる！

```java
1 public class Main{
2  public static void main(String[] args){
3     MuscleBoy mb1 = new MuscleBoy();
4     mb1.hp = 100;
5     MuscleBoy mb2 = new MuscleBoy();
6     mb2.hp = 70;
7     }
8 }
```

同じMuscleBoyクラスからインスタンスが生成されたけど、それぞれ異なるhp値を持つことが可能 :white_flower: :bangbang: :bangbang: 

---

ではでは、ここから***が***今回の本題です！
たとえば、４名の筋肉男子がチームを組んで、ベストボディ・ジャパン大会に出場するまでのストーリーゲームを作る場合を考えてみましょう :muscle: :muscle: :fire: :dash: 
次のようなクラスから生成されるインスタンスでは、それぞれが名前・HP・お金フィールドを別々に持っている。

```java
1 public class MuscleBoy{
2   int hp;
3   String name;
4   int money;
5 }
```

しかし、プログラムを開発していると「各インスタンスで共有したい情報」が出てくる。
このゲームはチームを組んで行動しているので、チーム全員のお金を１つにまとめたい！！っていう設定をしたい場合もあるかもしれない。

同じクラスから生成されたインスタンスでフィールドを共有したい場合には、
フィールド宣言の先頭に***static***を追加 :bangbang: :bangbang: 

```java
1 public class MuscleBoy{
2  int hp;
3  String name;
4  static int money;　　　　　　　　　　　//静的フィールド
5 }
```

staticを指定したフィールドは***静的フィールド***と言われているよ！
性的ではないよ :no_good: :x: :bangbang: :bangbang: 

###静的フィールド
1.フィールド変数の実体がクラスに置かれる
通常、フィールドが格納される箱（領域）は個々のインスタンスごとに用意されるが、静的フィールドの箱はインスタンスではなく、クラスに対して１つだけ用意される。

> 【静的フィールドへのアクセス方法】
クラス名.静的フィールド名

```java
1 public class Main{
2  public static void main(String[] args){
3    MuscleBoy mb1 = new MuscleBoy();
4    MuscleBoy mb2 = new MuscleBoy();
5    System.out.println(mb1.name);
6    System.out.println(MuscleBoy.money);  
7  }
8 }
```

2.全インスタンスに、箱の分身が置かれる
mb1やmb2といった各インスタンスにもmoneyという名前で「箱の分身」を使える。
「mb1.money」、「mb2.money」という分身の箱に値を代入すれば、Muscle.moneyにその値が代入される :wink: :sparkles: 

```java
1 public class Main{
2  public static void main(String[] args){
3    MuscleBoy mb1 = new MuscleBoy();
4    MuscleBoy mb2 = new MuscleBoy();
5    MuscleBoy.money = 1000;
6    System.out.println(MuscleBoy.money);  //1000と表示
7    System.out.println(mb1.money);   //1000と表示
8    mb1.money = 2000;　　　　　　　　　//mb1に2000を代入
9    System.out.println(mb2.money);  //mb2.moneyでも2000と表示
10  }
11 }
```

3.インスタンスを１つも生み出さなくても利用可能！
 
```java

1 public class Main{
2  public static void main(String[] args){
3    //１人も筋肉ボーイを生み出していない状況
4    MuscleBoy.money = 1000;
5    System.out.println(MuscleBoy.money);
6 }
7}
```

####静的メソッド

MuscleBoyクラスに、「筋肉ボーイの所持金をランダムに設定する」setRandomMoney()メソッドを追加してみる :exclamation: 

```java
1 public class MuscleBoy{
2  int hp;
3  String name;
4  static int money;
5
6  static void setRandomMoney(){       //staticをつけたメソッド
7    MuscleBoy.money = (int) (Math.random() * 1000);
8   }
9 }
```

staticがついているメソッドは、***静的メソッド***または***クラスメソッド***と呼ばれ、静的フィールドと合わせて、***静的メンバ***と総称されている :grin: :sparkles: :sparkles: 

1.メソッド自体がクラスに属する
【静的メソッドが呼び出される方法１】
>クラス名.メソッド名();

2.インスタンにメソッドの分身が置かれる
【静的メソッドが呼び出される方法２】
>インスタンス変数.メソッド名();

3.インスタンスを１つも生み出さなくても呼び出せる

```java
1 public class Main{
2   public static void main(String[] args){
3    MuscleBoy.setRandomMoney();
4    System.out.println(MuscleBoy.money);   //ランダムな金額が表示される
5    MuscleBoy mb1 = new MuscleBoy();
6    System.out.println(mb1.money);     //同じ金額を表示
7   }
8 }
```