Java入門23 static修飾子で静的に定義する

Java入門の第23回です。前回からの続きですが、今回だけでも分かる内容になっています。このシリーズの第1回はこちらです。

今回は、static修飾子について解説します。static修飾子は「Java入門14 クラスメソッド」の回で登場していますが、あらためてstatic修飾子の使い方を確認しましょう。

static修飾子はクラス固有の変数やメソッドであることを表す

static修飾子は、クラス固有の変数やメソッドを定義する際に指定する修飾子です。

クラス名・変数名・メソッド名の前にstaticキーワードを付けると、それらはインスタンス変数やインスタンスメソッドではなく、クラス固有の変数やクラス固有のメソッドであると定義したことになります。

例えば、以下のように先頭にstaticを付けて変数を宣言すれば、インスタンス変数ではなくクラス変数として宣言したことにになります。

static int sum = 0;

また、 以下のように先頭にstaticを付けてメソッドを定義すれば、インスタンスメソッドではなくクラスメソッドとして定義したことにになります。

static void printSum(int a, int b, int c) {
    sum = sum + a + b + c;
    System.out.println("合計得点:" + sum);
}

static修飾子を使用した実例

以下は、static修飾子を使用したコードの実例です。

public class Test27 {
    //クラス変数
    static int sum = 0;
    //クラスメソッド
    static void printSum(int a, int b, int c) {
        sum = sum + a + b + c;
        System.out.println("合計得点:" + sum);
    }
    //メインメソッド
    public static void main(String[] args) {
        //得点を代入
        int scoreA = 80;
        int scoreB = 75;
        int scoreC = 63;
        //クラスメソッドを呼び出す
        printSum(scoreA, scoreB, scoreC);
    }
}

上記コードの実行結果は、以下の通りです。

合計得点:218

上記コードでは、変数sumやprintSum()メソッドの先頭にstaticキーワードを付けて宣言しています。 先頭にstaticキーワードを付けることで、これらの変数やメソッドがインスタンスに紐づいたフィールドではなく、クラス固有のstaticなフィールドであることを定義しています。

staticフィールドは「静的・固定的」

先頭にstaticをつけた変数やメソッドは、クラスに紐づいたstaticフィールドです。先頭にstaticをつけない変数やメソッドは、生成されるインスタンスごとに紐づいたインスタンスフィールドです。

staticフィールドは、インスタンスを生成しなくても使えます。クラスに紐づいたフィールドであり、クラス変数はいつも同じ値を持ち、クラスメソッドはいつも同じ実行結果となります。

インスタンスフィールドは、インスタンスを生成してから使うものです。インスタンス変数は生成したインスタンスごとに異なる値を持ち、インスタンスメソッドは生成したインスタンスごとに異なる実行結果となります。

static という単語は「静的・固定的」という意味です。staticフィールドはJavaの実行メモリ内に1つしか存在せず、静的・固定的です。一方、インスタンスフィールドはインスタンスごとに生成されるので、Javaの実行メモリ内に複数存在する可能性があり変動的です。

まとめ

  • 先頭に staticがついていたら、それはクラス変数やクラスメソッドであり、インスタンスを生成せずに使える。 Javaの実行メモリ内に1つしか存在せず静的・固定的なもの。
  • 先頭に staticがついていなければ、それはインスタンス変数やインスタンスメソッドであり、インスタンスを生成してから使う。 Javaの実行メモリ内に複数存在する可能性があり変動的なもの。

次回へ続きます。