static句とクラス
メインメソッドのメソッド名の前についているstaticという文言についてです。
標準出力やクラスの書き方、呼び出し方を理解していれば読めると思います。
クラス変数
普通、クラスはインスタンス化して使います。試しに次のメソッドを考えてみましょう。
public class Calculate {
private int s = 3;
public int multipleIntegerNumber(int num){
s = num + s;
s = num + s;
return s;
}
}
これをメインメソッドの中で呼び出してみます。
public class Mainmethod{
public static void main(String[] args){
int result;
Calculate calculate = new Calculate();
result = calculate.multipleIntegerNumber(3);
}
}
すると、変数resultは9です。
では、次のように変えてみましょう。
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;
}
}
このクラスをつぎのメインメソッドから呼び出してみましょう。
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 はどうなるでしょうか。
結論から言えば
となります。なんと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メソッドで値を出しています。
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つのインスタンスから呼び出しています。
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();
結果は次のようになります。
このようにして。変数instans_countでそのインスタンスから呼び出された回数をカウントでき、変数static_countからすべてのインスタンスから呼び出された総数をカウントすることが出来ます。