クラス変数


今回はクラス変数についてみていきます。

クラス変数とは

wikipedia引用

クラス変数(class variable)とは、同一クラス・派生クラスで共有される変数である。 そのため、関連クラスに渡って共通に使用できる大域変数(グローバル変数)であるともいえる。
これに対して、インスタンスごとに確保される変数のことを、インスタンス変数あるいは単にフィールド (計算機科学)、データメンバ、メンバ変数などと呼ぶ。

1つのクラスから複数のインスタンスを生成できます。インスタンス変数を参照するときは、どのインスタンスの変数なのか指定して参照します。同様にクラス変数の場合は、どのクラスの変数なのか指定して参照します。インスタンス変数はインスタンスごとに独立して確保される変数に対し、クラス変数はクラスごとに確保される変数です。

クラス変数の宣言

【StaticSample.java】

public class StaticSample {
    static int allPageNo = 0;
    int pageNo;

    StaticSample(int pageNo){
    	this.pageNo = pageNo;
    	allPageNo++;
    }
    void displayPage(){
    	System.out.println(this.pageNo + "/" + allPageNo);
    }
}

java094

「StaticSample」クラスでは2つのフィールド宣言があります。フィールドは基本的にインスタンスが生成されると、そのインスタンスで独立した変数となりますが、あるキーワードを付けることによりクラス変数にすることができます。

   static int allPageNo = 0;

static  型 クラス変数名

「static」キーワードをフィールド宣言時につけることによりクラス変数となり、クラス自身が確保する変数となります。

   allPageNo++;

サンプル「StaticSample」クラスでのクラス変数の処理ですが、コンストラクタ内で「+1」しています。つまりインスタンスの生成ごとに「+1」されるので,このクラスから生成したインスタンスの数を表しています。

【Sample.java】

public class Sample{
    public static void main(String[] args) {
    	StaticSample page1 = new StaticSample(1);
    	StaticSample page2 = new StaticSample(2);
    	StaticSample page3 = new StaticSample(3);

    	page1.displayPage();
    	page2.displayPage();
    	page3.displayPage();
    }
}
1/3
2/3
3/3

3行目で1つ目のインスタンスを生成しています。この時点でクラス変数「allPageNo」は1足され値は「1」となっています。
4行目で2つ目のインスタンスを生成しています。この時点もクラス変数「allPageNo」は1足され値は「2」となっています。
5行目も同様です。クラス変数「allPageNo」の値は「3」になります。
結果をみれば、クラス変数「allPageNo」の値は「3」になっていることがわかります。

クラス変数の参照

【StaticSample.java】

public class StaticSample {
    static int allPageNo = 0;
    int pageNo = 0;
}

【Sample.java】

public class Sample{
    public static void main(String[] args) {
    	System.out.println(StaticSample.allPageNo);
    }
}

クラス変数はクラス自身が持つ変数です。ですのでインスタンスを生成しなくても直接クラスを指定して参照することができます。

クラス名.クラス変数名

では、クラス変数でないpageNoフィールドをクラスを指定して直接参照するとどうなるかみてみます。

    System.out.println(StaticSample.pageNo);

Exception in thread "main" java.lang.Error: Unresolved compilation problem
非 static フィールド StaticSample.pageNo を static 参照できません

結果はエラーになります。クラス変数でないフィールドは、インスタンス生成後にインスタンス変数となります。インスタンスごとに確保される変数なのでクラス指定では参照できません。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です