Java入門|クラス変数とクラスメソッド

全戦士で共有する力と、個別に持つ力を見極めろ!クラス単位のしくみをマスターしよう

これまで学んできたインスタンス変数やインスタンスメソッドは、「悟空」「ベジータ」のようにそれぞれの戦士ごとに持つ情報や能力でしたね。ところが、ドラゴンボールの世界には、個人ではなく「サイヤ人全体」に関わる情報もあります。

たとえば「今、戦士が何人いるのか」という情報は、悟空だけでもベジータだけでもなく、サイヤ人全体で共有されるものです。このような「クラス全体で扱う情報や処理」を表現するのが、クラス変数とクラスメソッドです。

ここでは、インスタンス(個人)とクラス(全体)の違いをドラゴンボールでイメージしながら、しっかり整理していきます。

クラス全体に関連づけられるメンバとは?

これまでのインスタンス変数は、

  • 悟空の戦闘力
  • ベジータの戦闘力

のように「個人ごとの情報」でした。

一方、クラス変数はこういうイメージです。

  • サイヤ人は全部で何人いるか

これは悟空にもベジータにも共通する、全体の情報です。

このように、

  • オブジェクトごと → インスタンス変数
  • クラス全体 → クラス変数

という違いがあります。

そして、クラスに関連づけられたメンバには static をつけるのがルールです。

実際のコードで見てみる

ファイル名:Sample8.java

class Saiyan
{
    public static int count = 0;

    private int power;
    private double energy;

    public Saiyan()
    {
        power = 0;
        energy = 0.0;
        count++;
        System.out.println("戦士を作成しました。");
    }

    public void setSaiyan(int p, double e)
    {
        power = p;
        energy = e;
        System.out.println("戦闘力を" + power + " 気の量を" + energy + "にしました。");
    }

    public static void showCount()
    {
        System.out.println("戦士は全部で" + count + "人います。");
    }

    public void show()
    {
        System.out.println("戦闘力は" + power + "です。");
        System.out.println("気の量は" + energy + "です。");
    }
}

class Sample8
{
    public static void main(String[] args)
    {
        Saiyan.showCount();

        Saiyan goku = new Saiyan();
        goku.setSaiyan(9000, 20.5);

        Saiyan.showCount();

        Saiyan vegeta = new Saiyan();
        vegeta.setSaiyan(8500, 30.5);

        Saiyan.showCount();
    }
}

クラス変数は「全員で共有する値」

このコードのポイントはここです。

public static int count = 0;

この count はクラス変数です。

そしてコンストラクタでこうしています。

count++;

つまり戦士が1人作られるたびに、

  • 0 → 1 → 2 → 3…

と増えていきます。

ポイント

項目内容
count全戦士の人数
特徴全オブジェクトで共有
キーワードstatic

悟空とベジータは別々のオブジェクトですが、
count は共通で1つしかありません。

クラスメソッドはオブジェクトなしで使える

次にこのメソッドを見てください。

public static void showCount()

これがクラスメソッドです。

呼び出し方が特徴的です。

Saiyan.showCount();

ポイント

  • オブジェクト不要
  • クラス名で呼び出す

つまり、

  • goku.showCount() ❌
  • Saiyan.showCount() ⭕

となります。

インスタンスとクラスの違いを整理

ここが一番大事なポイントです。

種類対象
インスタンス変数個人power
クラス変数全体count
インスタンスメソッド個人の処理show()
クラスメソッド全体の処理showCount()

ドラゴンボールで言うと:

  • power → 個々の戦士の強さ
  • count → サイヤ人の総人数

この図では、

  • 左:設計図(Saiyanクラス)
  • 右:実体(悟空・ベジータ)

となっています。

そして重要なのは、

  • power / energy → 各オブジェクトに1つずつある
  • count → 全体で1つだけある

という違いです。

クラスメソッドの注意点

クラスメソッドには制限があります。

thisが使えない

// NG
this.count

理由:

  • クラスメソッドは「特定の戦士」に属さないから

インスタンス変数に直接アクセスできない

// NG
System.out.println(power);

理由:

  • どの戦士の power かわからない

ローカル変数との違いも整理

最後にもう一つ整理しておくと理解が深まります。

種類範囲
インスタンス変数オブジェクト単位power
クラス変数クラス全体count
ローカル変数メソッド内のみp, e

いちばん大事な感覚

ここで一番重要なのはこの理解です。

  • インスタンス → 個人(悟空・ベジータ)
  • クラス → 全体(サイヤ人という種族)

そして、

  • 個人の情報 → インスタンス変数
  • 全体の情報 → クラス変数
  • 個人の動き → インスタンスメソッド
  • 全体の動き → クラスメソッド

この切り分けができるようになると、設計力が一気に上がります。

ドラゴンボールで考えると、

  • 悟空の戦闘力は個別
  • サイヤ人の人数は共通

この違いを意識できれば、クラス変数とクラスメソッドはしっかり理解できています 👍