例えば、以下のクラスをnewしてインスタンスを生成する際、インスタンスをnewした回数を取り扱いたい場合は、クラスの中にクラスフィールドという、全インスタンスに共通の情報保存場所が必要になります。
この保存場所をクラスフィールド(またはクラス変数、スタティックフィールド)と呼び、クラス内に宣言することができます。
これまでに作ってきたクラス
class TestClassSub { //フィールドの初期化 int TestA = 10; int TestB = 30; TestClassSub(int a, int b) { //やっていることは「setTest」メソッドを同じ TestA = a; TestB = b; } TestClassSub() { //引数なしコンストラクタ用 } void setTest(int a, int b){ TestA = a; TestB = b; } int sumAB(){ return TestA + TestB; } }
上記のクラスに対し、クラスフィールドを加えたクラス
class TestClassSub { //フィールドの初期化 int TestA = 10; int TestB = 30; static int TestC = 20; TestClassSub(int a, int b) { //やっていることは「setTest」メソッドを同じ TestA = a; TestB = b; } TestClassSub() { //引数なしコンストラクタ用 } void setTest(int a, int b){ TestA = a; TestB = b; } int sumAB(){ return TestA + TestB; } }
上記のTestClassSubクラスを使う場合、一度、クラスのインスタンスを生成し、クラスフィールドを加算するメソッドを何度か呼んでみます。
public class TestClass5 { public static void main(String[] args) { int retA; System.out.print("hello\n"); //引数なしコンストラクタ TestClassSub tc = new TestClassSub(); retA = tc.countUpTestC(); System.out.print("retA -> " + retA + "\n"); retA = tc.countUpTestC(); System.out.print("retA -> " + retA + "\n"); retA = tc.countUpTestC(); System.out.print("retA -> " + retA + "\n"); retA = tc.countUpTestC(); System.out.print("retA -> " + retA + "\n"); retA = tc.countUpTestC(); System.out.print("retA -> " + retA + "\n"); } } class TestClassSub { //フィールドの初期化 int TestA = 10; int TestB = 30; static int TestC = 20; TestClassSub(int a, int b) { //やっていることは「setTest」メソッドを同じ TestA = a; TestB = b; } TestClassSub() { //引数なしコンストラクタ用 } void setTest(int a, int b){ TestA = a; TestB = b; } int sumAB(){ return TestA + TestB; } int countUpTestC(){ return TestC++; } }
すると、実行した結果は次のようになります。
hello retA -> 20 retA -> 21 retA -> 22 retA -> 23 retA -> 24