
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 |
いちばん大事な感覚
ここで一番重要なのはこの理解です。
- インスタンス → 個人(悟空・ベジータ)
- クラス → 全体(サイヤ人という種族)
そして、
- 個人の情報 → インスタンス変数
- 全体の情報 → クラス変数
- 個人の動き → インスタンスメソッド
- 全体の動き → クラスメソッド
この切り分けができるようになると、設計力が一気に上がります。
ドラゴンボールで考えると、
- 悟空の戦闘力は個別
- サイヤ人の人数は共通
この違いを意識できれば、クラス変数とクラスメソッドはしっかり理解できています 👍
