Javaプログラミング (static句と「クラス変数」)

#static句とクラス
メインメソッドのメソッド名の前についているstaticという文言についてです。
標準出力やクラスの書き方、呼び出し方を理解していれば読めると思います。
##クラス変数
普通、クラスはインスタンス化して使います。試しに次のメソッドを考えてみましょう。

```java
public class Calculate {
 private int s = 3;
 public int multipleIntegerNumber(int num){
  s = num + s;
  s = num + s;
  return s;  
 }
}
```
これをメインメソッドの中で呼び出してみます。

```java
public class Mainmethod{
  public static void main(String[] args){
    
  int result; 
   
   Calculate calculate = new Calculate(); 
   result = calculate.multipleIntegerNumber(3);
  }
}
```
すると、変数resultは9です。
では、次のように変えてみましょう。

```java
public class Calculate {
private static int s = 3;
	private int ns = 3;
	int[] r = new int[2];

	public int[] multipleIntegerNumber1(int num){
	 s = 2*num + s; // -----> A
	 ns = 2*num + ns; 

	 r[0] = s;
	 r[1] = ns;
	 return r;

	}
}
```
このクラスをつぎのメインメソッドから呼び出してみましょう。

```java
public class Mainmethod{
  public static void main(String[] args){
    
   int[] result1;
   int[] result2;

   ClassValue calculate1 = new ClassValue();
   ClassValue calculate2 = new ClassValue();

   result1 = calculate1.multipleIntegerNumber1(3);// -------> ➀
   result2 = calculate2.multipleIntegerNumber1(3);// -------> ➁

  }
}
```
ここで、result1 と result2 はどうなるでしょうか。
結論から言えば
![qiita 1(クラス変数1).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531515/b4ecd018-fca0-22e7-2a6d-45a2f178e646.png)
となります。なんとresul2[0]は値が変わります。
それはstaticと付けたのことが原因です。staticがないときにはインスタンス毎に変数の値はリセットされます。しかし。staticを付けるインスタンスが変わっても変数の値が引き継がれます。今回の例の場合、変数nsは宣言時にstaticとつけていないので、インスタンスcalculate1,calculate2で値がリセットされました。しかし、変数sは宣言時にstaticとつけているのでインスタンスcalculate1,calculate2で値が引き継がれました。➀のときに$s(=3)$に$2{\times}num(=6)$が加算されて$9$になります。さらに、➁のときに$s(=9)$に$2{\times}num(=6)$が加算されて$15$になります。ちなみに、static句を付けるか付けないかでインスタンス変数とかクラス変数という呼び方をします。

| |インスタンス変数|クラス変数|
|---|---|---|
|宣言時にstatic句は|つけない|つける|
|変数の値|インスタンス毎に違う|すべてのインスタンスで共有|

##クラス変数の2つのメソッド
最後にもう一つのクラス変数の使い方を例をあげます。
次のClassValue2クラスではインスタンス変数static_countとクラス変数instans_countの2つが定義されています。そして、クラスの中で定義されている4つのメソッドが呼ばれるたびに2つの変数に1が足されていきます。そして、confirmationメソッドで値を出しています。

```java
public class ClassValue2 {
	private int s = 3;
	private static int static_count = 0;
	private int instans_count = 0;

	public void add(int num){
		s = num + s;
		static_count = static_count + 1;
		instans_count = instans_count + 1;
	}

	public void substract(int num){
		s = -num + s;
		static_count = static_count + 1;
		instans_count = instans_count + 1;
	}

	public void multiple(int num){
		s = num*s;
		static_count = static_count + 1;
		instans_count = instans_count + 1;
	}
	public void division(int num){
		s = 1/num*s;
		static_count = static_count + 1;
		instans_count = instans_count + 1;
	}

	public void confirmation(){
		System.out.println("static_count:" + static_count);
		System.out.println("instans_count:" + instans_count);
		System.out.println("s:" + s);
	}

}
```

それを次のように呼び出してみます。
3つのインスタンスから呼び出しています。

```java
ClassValue2 classValue2_1 = new ClassValue2();
classValue2_1.add(3);
ClassValue2 classValue2_2 = new ClassValue2();
classValue2_2.substract(1);
ClassValue2 classValue2_3 = new ClassValue2();
classValue2_3.division(2);
classValue2_1.confirmation();
classValue2_2.confirmation();
classValue2_3.confirmation();
```
結果は次のようになります。
![qiita 1(クラス変数2).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531515/457161b3-9af3-7caa-06fc-f97be937dfbe.png)
このようにして。変数instans_countでそのインスタンスから呼び出された回数をカウントでき、変数static_countからすべてのインスタンスから呼び出された総数をカウントすることが出来ます。