Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。

static

このページでは、static修飾子が付与されたクラス変数、クラスメソッドについて説明します。

概要

メンバ変数、メソッドを宣言する際、static修飾子が付与されたものをクラス変数、クラスメソッド、static修飾子が付与されていないものをインスタンス変数、インスタンスメソッドといいます。

クラス変数、クラスメソッドはそのクラス内で1つという位置付けです。そのクラスからいくつインスタンスを生成してもインスタンスごとにメンバ変数、メソッドが割り当てられることはありません。

クラス変数、クラスメソッドの位置付け

クラス変数、クラスメソッド

インスタンス変数、インスタンスメソッドはインスタンスごとに存在します。クラスからインスタンスが生成されるとそれぞれのインスタンスに対し、インスタンス変数、インスタンスメソッドが割り当てられます。Javaはオブジェクト指向プログラムの設計思想の元、クラスから生成されるインスタンスに対し様々な処理を実行していきます。そのため、Javaでメンバ変数、メソッドというと、通常、このインスタンス変数、インスタンスメソッドのことを指します。

インスタンス変数、インスタンスメソッドの位置付け

インスタンス変数、インスタンスメソッド

クラス変数、クラスメソッドが使用されるケースを以下に記載します。

  1. 複数のインスタンス間で値を共有したい場合にクラス変数を使用します。
    変化しない定数を各インスタンス間で共有する場合に、final修飾子と共に使用されます。
  2. 公式的な処理を行うメソッドにクラスメソッドを使用します。クラスMathで用意されているsin、cosなどはstatic修飾子が付与され宣言されています。
  3. インスタンスが生成されていなくても処理を行う必要があるときにクラスメソッドを使用します。クラスメソッドはインスタンスに依存しないため、インスタンスが生成されていなくても実行できます。mainメソッドはインスタンスを生成する前に実行する必要があるため、static修飾子を付けて宣言しています。

クラス変数を使用した例を以下に記載します。

ExClass12クラス

class ExClass12{
    //クラス変数の宣言
    static int standardSize;

    //クラス変数に値を設定
    void setSize(int num) {
      standardSize = num;
    }
}

Mainクラス

class Main {
    public static void main(String[] args) {
        ExClass12 ins1 = new ExClass12();
        //クラス変数に100を設定
        ins1.setSize(100);

        ExClass12 ins2 = new ExClass12();
        //クラス変数に300を設定
        ins2.setSize(300);

        //クラス変数は、インスタンス間で値を共有するため、
              //一番最後に設定された300が表示される
        System.out.println(ins1.standardSize);
        System.out.println(ins2.standardSize);
        System.out.println(ExClass12.standardSize);
    }
}

参照方法

クラス変数、クラスメソッドはクラス名を指定して参照します。インスタンス変数を通して参照することも許容されていますが、クラス変数、クラスメソッドがインスタンスに依存しないと言う性質を考えるとあまり推奨された方法ではありません。

クラス名.メンバ変数;
クラス名.メソッド;

【例2】クラス変数、クラスメソッドの参照方法を例示します。

class ExClassA{
    //クラスメンバ変数の宣言・生成
    static String classV = "クラス変数classV";
    //クラスメソッドの宣言
    static void classM() {
        System.out.println("クラスメソッドclassM");
    }

    public static void main(String[] args) {
        //クラス名を通してクラス変数を参照
        System.out.println(ExClassA.classV);
        //クラス名を通してクラスメソッドを参照
        ExClassA.classM();
    }
}

クラスメソッド利用時の注意点

クラスメソッドは、クラスに属するという性質上、その中で、インスタンスを指定した処理を記述することはできません。記述されていた場合は、プログラムがインスタンスを特定できずコンパイルエラーになります。具体的には、クラスメソッド内で、インスタンス変数や、インスタンスメソッドを使用することはできません。

【例3】インスタンスを指定した処理を記述しコンパイルエラーとなる例を例示します。

class ExClass13{
    //インスタンス変数(通常のメンバ変数)の宣言
    String name = "Java太郎";

    //インスタンスメソッド(通常のメソッド)の宣言
    void showInsName() {
        //インスタンスメソッドからインスタンス変数は参照可能なため、コンパイルエラーになりません。
        System.out.println(this.name);
    }

    //クラスメソッドの宣言
    static void showClassName() {
        //クラスメソッドからインスタンス変数は参照不可なため、コンパイルエラーになります。
        System.out.println(this.name);
    }
}

10static