カテゴリ: JavaSilver試験対策 更新日: 2026/07/11

Javaのstaticメンバを完全理解!初心者でも分かるメソッドとフィールドの違い

035
Javaのstaticメンバ

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

生徒

「Javaのstaticメソッドって普通のメソッドと何が違うんですか?」

先生

staticメソッドは、インスタンスを作らなくてもクラス単位で使える特別なメソッドです。ただし、いくつかルールがあるので、具体的なコードを見ながら学んでいきましょう!」

1. staticメソッドの基本

1. staticメソッドの基本
1. staticメソッドの基本

Javaでは、staticで修飾されたメソッドやフィールドは、クラスに属するメンバとして扱われます。インスタンスを作成せずにクラス名を使ってアクセスできるのが特徴です。

以下のコードを見てください:


public class StaticExample {
    static int counter = 0;

    public static void incrementCounter() {
        counter++;
    }

    public static void main(String[] args) {
        StaticExample.incrementCounter(); // staticメソッドの呼び出し
        System.out.println("Counter: " + StaticExample.counter);
    }
}

このコードでは、incrementCounterというstaticメソッドがcounterをインクリメントしています。実行結果は以下のようになります:


Counter: 1

staticメソッドとフィールドは、インスタンスではなくクラスに直接属しているため、このようにクラス名を使って呼び出せます。

2. staticメソッドのルール

2. staticメソッドのルール
2. staticメソッドのルール

staticメソッドには特別なルールがあります。以下にまとめました:

  • 他のstaticメンバにアクセス可能:staticメソッドは、同じクラス内のstaticフィールドやstaticメソッドにアクセスできます。
  • 非staticメンバにはアクセス不可:インスタンスに属するフィールドやメソッドに直接アクセスすることはできません。

次のコードを見てみましょう:


public class StaticRuleExample {
    static int sharedValue = 10;

    int instanceValue = 5;

    public static void staticMethod() {
        System.out.println(sharedValue); // OK
        // System.out.println(instanceValue); // コンパイルエラー
    }

    public void instanceMethod() {
        System.out.println(sharedValue); // OK
        System.out.println(instanceValue); // OK
    }
}

staticMethodではsharedValueにアクセスできますが、instanceValueにはアクセスできません。一方、instanceMethodでは両方のフィールドにアクセス可能です。

3. 実際の使い方

3. 実際の使い方
3. 実際の使い方

staticメソッドは、ユーティリティクラスや、クラス全体で共有する処理をまとめるときに便利です。例えば、計算用のユーティリティクラスを次のように作成できます:


public class MathUtil {
    public static int add(int a, int b) {
        return a + b;
    }

    public static int multiply(int a, int b) {
        return a * b;
    }
}

public class Main {
    public static void main(String[] args) {
        int sum = MathUtil.add(5, 3); // 8
        int product = MathUtil.multiply(5, 3); // 15
        System.out.println("Sum: " + sum + ", Product: " + product);
    }
}

実行結果:


Sum: 8, Product: 15

このように、staticメソッドを使えば、特定の機能をクラス単位でまとめて利用しやすくなります。

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

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

※ Amazon広告リンク

4. 試験対策:staticメソッドとフィールドの関係

4. 試験対策:staticメソッドとフィールドの関係
4. 試験対策:staticメソッドとフィールドの関係

試験でよく問われるstaticメソッドの性質について、以下のポイントを覚えておきましょう:

  • staticメソッドからは、非staticメンバにアクセスできない。
  • 非staticメソッドからは、staticメンバにアクセスできる。
  • static同士では自由にアクセス可能。

次のコードで復習してみましょう:


public class TestStatic {
    static String sharedMessage = "Hello, Static!";
    String instanceMessage = "Hello, Instance!";

    public static void printStaticMessage() {
        System.out.println(sharedMessage); // OK
        // System.out.println(instanceMessage); // エラー
    }

    public void printInstanceMessage() {
        System.out.println(sharedMessage); // OK
        System.out.println(instanceMessage); // OK
    }
}

実行結果を確認しながら、staticと非staticのルールをしっかり理解しましょう!

5. インスタンス変数とstatic変数のメモリ上の違い

5. インスタンス変数とstatic変数のメモリ上の違い
5. インスタンス変数とstatic変数のメモリ上の違い

「インスタンス変数」と「static変数」の最大の違いは、データがどこに保存され、どのように共有されるかという点にあります。インスタンス変数は「生成されたオブジェクト(インスタンス)ごと」に箱が作られますが、static変数は「クラスに対してたった一つ」しか作られません。

プログラミング未経験の方でも、以下の「社員クラス」の例を見るとイメージが湧きやすいはずです。


public class Employee {
    String name;          // インスタンス変数(社員ごとに違う名前)
    static String company; // static変数(全社員で共通の会社名)

    public static void main(String[] args) {
        Employee.company = "Java商事"; // クラス名で直接指定

        Employee e1 = new Employee();
        e1.name = "田中";

        Employee e2 = new Employee();
        e2.name = "佐藤";

        System.out.println(e1.name + "さんの会社: " + Employee.company);
        System.out.println(e2.name + "さんの会社: " + Employee.company);
    }
}

実行結果:


田中さんの会社: Java商事
佐藤さんの会社: Java商事

このように、全てのインスタンスで共通のデータ(定数や共通設定など)を持たせたい場合に static は非常に強力なツールとなります。

6. static初期化ブロックの使い方

6. static初期化ブロックの使い方
6. static初期化ブロックの使い方

static 変数に複雑な初期設定が必要な場合、static { ... } という特殊なブロック(static初期化ブロック)を使用できます。これは、クラスがメモリに読み込まれた瞬間に一度だけ実行される仕組みです。


import java.util.ArrayList;
import java.util.List;

public class ConfigManager {
    static List<String> settings = new ArrayList<>();

    // クラスがロードされた時に自動で動く
    static {
        settings.add("DarkMode: ON");
        settings.add("Language: JP");
        System.out.println("設定をロードしました。");
    }

    public static void showSettings() {
        for (String s : settings) {
            System.out.println(s);
        }
    }
}

通常のコンストラクタは new するたびに動きますが、static初期化ブロックは「そのクラスを使う準備が整ったとき」に一度だけ動くのが特徴です。データベースの接続準備や、共通リストの作成によく使われます。

7. staticメソッドをオーバーライドできない理由

7. staticメソッドをオーバーライドできない理由
7. staticメソッドをオーバーライドできない理由

Javaの重要なルールとして、static メソッドは「オーバーライド(子クラスでの上書き)」ができません。これは、static メソッドが「どのオブジェクトか」ではなく「どのクラスか」に基づいて呼び出し先が決まる(静的バインディング)ためです。


class Parent {
    public static void hello() {
        System.out.println("親クラスの挨拶");
    }
}

class Child extends Parent {
    // これはオーバーライドではなく「隠蔽(Hiding)」と呼ばれる別の現象
    public static void hello() {
        System.out.println("子クラスの挨拶");
    }
}

public class Main {
    public static void main(String[] args) {
        Parent p = new Child();
        p.hello(); // 変数の型(Parent)のメソッドが呼ばれる
    }
}

実行結果:


親クラスの挨拶

もし hello() が普通のメソッド(非static)であれば、実行結果は「子クラスの挨拶」になります。static を使う際は、多態性(ポリモーフィズム)が効かないという点に十分注意して設計しましょう。

まとめ

まとめ
まとめ

Javaのstaticメンバは、クラスに直接属し、インスタンスを作成せずに使用できる強力な機能です。staticフィールドは全てのインスタンスで共有され、staticメソッドは同じクラス内のstaticメンバにアクセス可能ですが、非staticなメンバにはアクセスできないという制約があります。一方で、非staticメソッドからはstaticメンバに自由にアクセスできます。

この特性を活かすことで、ユーティリティクラスや、クラス全体で共有する設定やカウント機能などを効率よく設計できます。試験や実務で問われるポイントとしては、staticメンバのアクセス制限を正しく理解し、適切に使い分けることが重要です。

次のコードで、まとめを確認してみましょう。


public class SummaryExample {
    static int sharedCounter = 0;
    int instanceCounter = 0;

    public static void incrementSharedCounter() {
        sharedCounter++;
        // instanceCounter++; // コンパイルエラー:非staticメンバにはアクセスできない
    }

    public void incrementInstanceCounter() {
        sharedCounter++; // OK: staticメンバにアクセス可能
        instanceCounter++;
    }

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

        obj1.incrementInstanceCounter();
        obj2.incrementInstanceCounter();
        incrementSharedCounter();

        System.out.println("Shared Counter: " + sharedCounter); // 出力: 3
        System.out.println("Instance Counter of obj1: " + obj1.instanceCounter); // 出力: 1
        System.out.println("Instance Counter of obj2: " + obj2.instanceCounter); // 出力: 1
    }
}

このコードでは、sharedCounterがクラス全体で共有され、インスタンス間で異なるinstanceCounterと区別して利用されています。

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

生徒

staticメンバは便利ですが、非staticとの違いをしっかり理解しないと混乱しそうですね。」

先生

「その通りです。特にstaticメソッドから非staticメンバにアクセスできない点は、Javaプログラムの基本的なルールとして覚えておきましょう。また、ユーティリティクラスの作成などにstaticを活用すれば、効率的な設計が可能です。」

生徒

「今日学んだルールを実際のコードで試してみます!」

先生

「ぜひそうしてください。staticメンバの使い方が分かると、Javaでの設計の幅が大きく広がりますよ。」

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

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

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

Javaのstaticメソッドとは何ですか?初心者でもわかるように教えてください。

Javaのstaticメソッドとは、クラスに属するメソッドで、インスタンスを作成せずにクラス名だけで呼び出せる特別なメソッドです。ユーティリティ的な処理や共通機能に使われます。

Javaのstaticフィールドとstaticメソッドの違いは何ですか?

staticフィールドはクラス全体で共有される変数で、staticメソッドはインスタンス不要で呼び出せる関数です。どちらもクラスに属するメンバであり、共通して使えるのが特徴です。

Javaでstaticメソッドを使うメリットは何ですか?

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の料金体系まとめ!ざっくり理解・高いと感じる理由も解説
Flutter
Flutter SDKのダウンロードとインストール手順を詳しく解説
Flutter SDKのダウンロードとインストール手順を丁寧ガイド!初心者でも安心な環境構築

🔌 USBポート不足を解消

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

UGREEN USB-Cハブを見る

※ Amazon広告リンク