カテゴリ: JavaSilver試験対策 更新日: 2026/03/24

Javaのstaticフィールドを徹底解説!初心者でも分かる共有データの仕組み

034
Javaのstaticフィールド

先生と生徒の会話形式で理解しよう

生徒

「Javaのstaticフィールドって何ですか?普通のフィールドとどう違うんですか?」

先生

「良い質問ですね!staticフィールドは、クラス全体で共有されるデータのことです。複数のインスタンス間で値を共有するために使われます。具体的な例を見てみましょう!」

1. staticフィールドとは?

1. staticフィールドとは?
1. staticフィールドとは?

Javaのstaticフィールドは、クラスに属する変数です。staticで修飾されたフィールドは、インスタンスごとではなく、クラス全体で共有されます。以下は基本的な例です:


public class Example {
    static int sharedValue = 0; // staticフィールド
}

上記のコードでは、sharedValueというstaticフィールドが定義されています。この変数は、クラス全体で1つだけ存在し、どのインスタンスからもアクセスできます。

2. staticフィールドへのアクセス方法

2. staticフィールドへのアクセス方法
2. staticフィールドへのアクセス方法

staticフィールドは、クラス名を使ってアクセスするのが一般的ですが、インスタンスを使ってアクセスすることも可能です。以下の例を見てください:


public class StaticAccessExample {
    public static void main(String[] args) {
        Example.sharedValue = 10; // クラス名を使ってアクセス
        Example instance = new Example();
        instance.sharedValue = 20; // インスタンスを使ってアクセス
        System.out.println(Example.sharedValue); // 出力: 20
    }
}

上記の例では、Example.sharedValueに最初に10を代入し、その後インスタンス経由で20に変更しました。結果として、sharedValueは20に更新され、どのインスタンスからも同じ値が共有されます。

3. staticフィールドの性質

3. staticフィールドの性質
3. staticフィールドの性質

staticフィールドには以下の特徴があります:

  • インスタンスを作らなくてもアクセスできる。
  • 全てのインスタンスで同じ値を共有する。
  • クラスがロードされるときにメモリ上に作成される。

次のコードで確認してみましょう:


public class StaticExample {
    static int sharedValue = 0;

    public static void main(String[] args) {
        StaticExample.sharedValue = 5; // クラス名でアクセス
        StaticExample obj1 = new StaticExample();
        StaticExample obj2 = new StaticExample();
        obj1.sharedValue += 10; // obj1を使ってアクセス
        obj2.sharedValue = 20; // obj2を使ってアクセス
        System.out.println(StaticExample.sharedValue); // 出力: 20
    }
}

実行結果は20です。staticフィールドはクラス全体で1つだけ存在するため、どのインスタンスからも同じ値が参照されます。

Javaをこれから始める人や、 オブジェクト指向の考え方を基礎から理解したい人には、 定番の入門書がこちらです。

スッキリわかるJava入門 第4版をAmazonで見る

※ Amazon広告リンク

4. 試験対策:staticフィールドを理解する

4. 試験対策:staticフィールドを理解する
4. 試験対策:staticフィールドを理解する

Javaのstaticフィールドに関する問題を解く際は、以下のポイントに注意しましょう:

  • クラス名を使ってアクセスする。
  • 複数のインスタンス間で値が共有される。
  • インスタンスごとのデータではなく、クラス全体のデータとして管理される。

次の例を使って復習しましょう:


public class TestStatic {
    static int count = 0;

    public static void main(String[] args) {
        TestStatic obj1 = new TestStatic();
        TestStatic obj2 = new TestStatic();
        obj1.count = 5; // obj1を使って更新
        obj2.count += 10; // obj2を使って加算
        System.out.println(TestStatic.count); // 出力: 15
    }
}

このコードでは、countの値がクラス全体で共有されているため、最終的な出力は15となります。

5. インスタンスフィールドとの違いを比較

5. インスタンスフィールドとの違いを比較
5. インスタンスフィールドとの違いを比較

staticフィールド(クラス変数)と、通常のフィールド(インスタンス変数)の最大の違いは、データの「持ち主」が誰かという点です。

通常のフィールドは、newして作られたインスタンスごとに独立したコピーを持ちますが、staticフィールドはクラスにつき1つしか存在しません。

以下の比較コードで、その違いを実感してみましょう:


public class VariableCompare {
    int instanceNum = 0;    // インスタンスごとに個別の箱
    static int staticNum = 0; // クラスで1つだけの共通の箱

    public void countUp() {
        instanceNum++;
        staticNum++;
    }
}

public class Main {
    public static void main(String[] args) {
        VariableCompare obj1 = new VariableCompare();
        VariableCompare obj2 = new VariableCompare();

        obj1.countUp();
        obj2.countUp();

        System.out.println("obj1のinstanceNum: " + obj1.instanceNum); // 出力: 1
        System.out.println("obj2のinstanceNum: " + obj2.instanceNum); // 出力: 1
        System.out.println("共通のstaticNum: " + VariableCompare.staticNum); // 出力: 2
    }
}

この結果から分かる通り、instanceNumは各オブジェクトでリセットされた状態で始まりますが、staticNumは全員で1つの値をカウントアップし続けています。

6. staticフィールドの活用例:インスタンスの個数を数える

6. staticフィールドの活用例:インスタンスの個数を数える
6. staticフィールドの活用例:インスタンスの個数を数える

staticフィールドの代表的な使い道の一つに、「そのクラスからインスタンスが何個作られたかをカウントする」というものがあります。

コンストラクタの中でstaticフィールドをインクリメント(+1)することで、生成されたオブジェクトの総数を常に把握できます。


public class Car {
    static int totalCars = 0; // 生産台数を管理する共通のカウンター

    public Car() {
        totalCars++; // インスタンスが作られるたびに1増える
    }
}

public class Factory {
    public static void main(String[] args) {
        new Car();
        new Car();
        new Car();
        System.out.println("合計生産台数: " + Car.totalCars);
    }
}

実行結果:


合計生産台数: 3

このように、個々の「車」が持つ情報ではなく、クラス全体(工場全体)で管理すべき情報を扱うのにstaticフィールドは最適です。

7. staticフィールド使用時の注意点

7. staticフィールド使用時の注意点
7. staticフィールド使用時の注意点

staticフィールドは非常に便利ですが、使いどころを間違えるとバグの原因になります。以下の注意点を意識しましょう:

  • メモリの節約と消費: クラスがロードされた瞬間にメモリが確保され、プログラム終了まで解放されません。大量のデータを保持し続けるとメモリを圧迫します。
  • 副作用の発生: どこからでも書き換えが可能なため、意図しない場所で値が変わってしまうリスクがあります。
  • 定数としての利用: 値を書き換えられたくない場合は、static finalを組み合わせて「定数」として定義するのが一般的です。

特に、static finalを使った定数宣言はJavaの実務で非常によく使われます:


public class Config {
    // 共通で使う不変の値(定数)
    public static final String APP_NAME = "Java学習システム";
}

共有すべきデータなのか、個別に持つべきデータなのかをしっかり見極めることが、美しいJavaコードを書くためのポイントです。

まとめ

まとめ
まとめ

この記事では、Javaのstaticフィールドについて詳しく解説しました。staticフィールドは、クラス全体で共有される特別なフィールドで、インスタンスを作成しなくてもアクセス可能です。この仕組みを理解することで、メモリを効率的に使ったプログラム設計が可能になります。

特に、staticフィールドがインスタンスではなくクラスに属するため、どのインスタンスからも同じ値を共有することや、クラス名を使ったアクセスが推奨される点を学びました。

以下は振り返りとしてstaticフィールドの基本的な使用例です:


public class StaticSummary {
    static int totalUsers = 0;

    public static void main(String[] args) {
        StaticSummary.userLogin(); // ログイン処理を呼び出し
        StaticSummary.userLogin();
        System.out.println("ログインしたユーザー数: " + StaticSummary.totalUsers);
    }

    public static void userLogin() {
        totalUsers++; // staticフィールドを操作
    }
}

このコードを実行すると、totalUsersがクラス全体で共有され、ユーザーのログイン数を管理できます。出力は以下のようになります:


ログインしたユーザー数: 2

これにより、staticフィールドの実用性をさらに実感できるでしょう。

先生と生徒の振り返り会話

生徒

staticフィールドを使うと、全体で共有できるデータを管理しやすくなるんですね!インスタンスごとの値と混乱しないように気をつけます。」

先生

「その通りです。staticフィールドは効率的ですが、使いすぎるとプログラムが複雑になるので、必要なときだけ活用するようにしましょう。」

生徒

「例えば、ゲームのプレイヤーカウントとか、アプリ全体の設定に使えそうですね!」

先生

「良い例ですね。そういった場合にはstaticフィールドが役立ちます。それでは次回は、staticメソッドについて学びましょう!」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Javaのstaticフィールドとは何ですか?

Javaのstaticフィールドとは、インスタンスではなくクラスに属する変数のことです。全てのインスタンスで値が共有されるため、共通の情報を管理したい場合に便利です。

Javaのstaticフィールドはどのように使われますか?

staticフィールドは、クラス名を使って直接アクセスできます。例えば、「クラス名.フィールド名」で使用でき、インスタンスを作成しなくても値を操作できます。

Javaの通常のフィールドとstaticフィールドの違いは何ですか?

通常のフィールドはインスタンスごとに独立していますが、staticフィールドはすべてのインスタンスで共有されます。そのため、1つの値を全体で共有したい場合にstaticが使われます。
JavaSilver試験対策の一覧へ
新着記事
Java
Javaの演算子の優先順位
Javaの演算子の優先順位を完全解説!初心者向けの丁寧な解説
Java
Javaのローカル変数と順次処理
Javaのローカル変数と順次処理を徹底解説!初心者でも理解できるコードの基本
Python
NumPyのdtype一覧!int・float・bool・str・objectの違いを比較
NumPyのdtype一覧を完全解説!int・float・bool・str・objectの違いを初心者向けに比較
Dart
Dartのコンストラクタまとめ!デフォルト・名前付きコンストラクタの使い方
Dartのコンストラクタまとめ完全ガイド!デフォルトコンストラクタと名前付きコンストラクタの使い方を初心者向けに解説
人気記事
Java
Java の Random クラスを使ってランダムな数値を生成する方法
JavaのRandomクラスの使い方を完全ガイド!初心者でもわかる乱数生成
Java
Java の getter メソッドと setter メソッドの使い方
Javaのgetterメソッドとsetterメソッドの使い方を完全ガイド!初心者でもわかるアクセス方法
AWS
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
AWS
【AWS】S3の料金体系まとめ!無料枠・課金ポイント・見積もり方法まで
【AWS】S3の料金体系まとめ!無料枠・課金ポイント・見積もり方法まで

🔌 USBポート不足を解消

Type-C 1本で拡張。
開発・作業環境を一気に快適に

UGREEN USB-Cハブを見る

※ Amazon広告リンク