Java入門

【Java入門】static変数とstaticメソッド

2021年5月6日

はじめに

前回の記事では、Javaのインタフェースについて紹介しました。

本記事では、Javaのstatic変数とstaticメソッドについて紹介します。

staticとは

staticは変数(フィールド)やメソッドにつける修飾子です。

staticの書き方

staticがついた変数やメソッドは、クラスのオブジェクト(インスタンス)を生成しなくても呼び出せます。

static変数は「クラス名.変数名」、staticメソッドは「クラス名.メソッド名」のように「クラス名.」の後に記述することで呼び出すことができるため、static変数はクラス変数、staticメソッドはクラスメソッドとも呼ばれています。

スポンサーリンク

static変数とは

static変数とは、static修飾子がついた変数のことです。また、static修飾子がついていない変数のことをインスタンス変数といいます。

static変数とインスタンス変数の違い

インスタンス変数は、クラスのオブジェクト(インスタンス)を生成したタイミングで作られる変数です。

そして、クラスのオブジェクト(インスタンス)毎に管理されています。(オブジェクト毎に変数が作られる)

インスタンス変数の説明

static変数は、クラスのオブジェクト生成(インスタンス生成)に関係なく作られる変数です。(static変数に最初にアクセスしたタイミングで作られる)

そのため、クラスのオブジェクト(インスタンス)に関係なく共通で管理しています。(共通で1つの変数が作られる)

static変数の説明

static変数の実装例

それでは、実際にソースコードでstatic変数の使用例を紹介します。

次の例では、フィールドにインスタンス変数「instanceNum」とstatic変数「staticNum」を定義し、「numPrint」メソッドでインスタンス変数とstatic変数の値に1を加算して、結果を出力しています。

[StaticSampleクラス]

public class StaticSample {
    /**
     * インスタンス変数
     */
    public int instanceNum = 0;
    /**
     * static変数(クラス変数)
     */
    public static int staticNum = 0;
    /**
     * 変数の値を出力
     */
    public void numPrint() {
        // インスタンス変数を加算
        instanceNum++;
        // static変数を加算
        staticNum++;

        System.out.println("インスタンス変数の値:" + instanceNum);
        System.out.println("static変数の値:" + staticNum);
    }
}

[プログラムの実行]

public class StaticSampleMain {

    public static void main(String[] args) {

        StaticSample sample1 = new StaticSample();
        sample1.numPrint();

        StaticSample sample2 = new StaticSample();
        sample2.numPrint();
    }
}

[実行結果]

インスタンス変数の値:1
static変数の値:1
インスタンス変数の値:1
static変数の値:2

プログラムを実行した結果、インスタンス変数は、クラスのオブジェクト(インスタンス)毎に管理している変数のため、出力結果はいずれも「1」です。

スポンサーリンク

static変数は、クラスのオブジェクト(インスタンス)に関係なく共通で管理している変数のため、出力結果は「sample1.numPrint()」のときは「1」、「sample2.numPrint()」のときは「2」と、sample1のオブジェクト(インスタンス)とsample2のオブジェクト(インスタンス)で値を共有しているのがわかります。

static変数は、静的な変数であり、オブジェクト毎に管理しているインスタンス変数とは違い、static変数の実体は1つです。

staticメソッドとは

staticメソッドとは、static修飾子がついたメソッドのことです。また、static修飾子がついていないメソッドのことをインスタンスメソッドといいます。

インスタンスメソッドは、クラスのオブジェクト(インスタンス)を生成したタイミングで使えるようになるメソッドです。それに対しstaticメソッドは、クラスのオブジェクト(インスタンス)を生成しなくても使用できます。

staticメソッドの使い方

staticメソッドの主な使い方は、インスタンスの状態に依存しない処理をさせることです。これはユーティリティメソッドとも呼ばれ、決まりきった処理などに用いられます。

例えば、標準APIのStringクラスで考えると、値を比較する「equals」メソッドはインスタンスメソッド、int型の変数をString型に変換する「valueOf」はstaticメソッドです。

Stringはnewしなくても使えるので、クラスではなく基本データ型(プリミティブ型)のように感じますが、Stringはクラス型の変数です。

public boolean equals(Object anObject) ← インスタンスメソッド

public static String valueOf(int i) ← staticメソッド

インスタンスメソッドである「equals」メソッドは、Stringオブジェクト(インスタンス)と一致しているかを比較するメソッドであり、Stringオブジェクト(インスタンス)の状態に依存しています。

[例]

String value = "あああ";

value.equals("いいい"); ← Stringのオブジェクト「value」に依存している

それに対し、staticメソッドである「valueOf」メソッドは、int型の変数をString型の変数に変換するメソッドであり、Stringオブジェクト(インスタンス)の状態に依存していません。

[例]

String newValue = String.valueOf(123); ← Stringのオブジェクトに関係ない処理

このように、staticメソッドの主な使い方は、インスタンスの状態に依存しない処理をさせることです。

staticメソッドは、むやみやたらと使うと読みづらく使いづらいものになるので、基本、staticメソッドにしないといけないもの以外は、インスタンスメソッドで作成するようにしましょう。

staticメソッドの実装例

それでは、実際にソースコードでstaticメソッドの使用例を紹介します。

次の例では、インスタンスの状態に依存しないメソッド「isNumber」を定義しています。「isNumber」メソッドは正規表現を使い引数の値が数値であるかを判断する処理です。(※標準APIのPatternクラスを使用)

また「UtilitySample」クラスには、staticメソッドしか実装していないので、コンストラクタをprivateとし、外部からオブジェクト(インスタンス)を生成できないようにしています。

コンストラクタをprivateにすることで、ユーティリティクラスであることを明確にしています。

[UtilitySampleクラス]

import java.util.regex.Pattern;

public class UtilitySample {

    private UtilitySample() {}

    /**
     * 数値チェック
     * @param value 検証対象の値
     * @return 結果(true:数値、false:数値ではない)
     */
    public static boolean isNumber(String value) {
        boolean result = false;
        if (value != null) {
            Pattern pattern = Pattern.compile("^[0-9]+$|-[0-9]+$");
            result = pattern.matcher(value).matches();
        }
        return result;
    }
}

[プログラムの実行]

public class UtilitySampleMain {

    public static void main(String[] args) {
        System.out.println("数値チェックの結果:" + UtilitySample.isNumber("あいうえお"));
    }
}

[実行結果]

数値チェックの結果:false

終わりに

本記事では、JavaのJavaのstatic変数とstaticメソッドについて紹介しました。

次回の記事では、Javaの列挙型(enum)について紹介します。

helpful