class Team{ int win; int lose; static int year; public void show() { System.out.println(win + "勝" + lose + "敗"); } public static void about() { System.out.println("チームを表すクラスです"); } }
通常、クラス内で定義されるフィールドは、インスタンスごとに個別の領域を持ちます。インスタンスを生成後に使用可能となります。
// インスタンス生成 Team t1 = new Team(); Team t2 = new Team(); // インスタンス毎のフィールド t1.win = 5; t2.win = 3; System.out.println(t1.win); System.out.println(t2.win);
win や lose は、static が付いていないため、それぞれのインスタンス (t1, t2) が別々に持っている情報です。t1 の勝ち数 (t1.win) と t2 の勝ち数 (t2.win) は、それぞれ独立して管理できます。
しかし、staticなフィールドはクラスにつき1つしかありません。クラス名.フィールド名 で使用可能です。インスタンスの生成も必要ありません。
Team.year = 2024; System.out.println(Team.year);
主な用途はfinalを付けて定数として使われることが一般的です。定数は書き換えることが無いため、全クラスで1つあれば十分です。なお、定数は全て大文字で記述するのが一般的です。
public static final int YEAR = 2024;
通常のメソッドはインスタンスを生成してから呼び出す必要があります
Team t1 = new Team(); Team t2 = new Team(); t1.show(); t2.show();
staticなメソッドはインスタンスを生成せず クラス名.メソッド名 で呼び出せます。
Team.about();
staticなメソッドはインスタンスに関わりなく存在します。そのため、非staticのフィールド・メソッドにアクセスできません。
public static void about() { System.out.println(win); // エラー System.out.println(YEAR); // OK show(); // エラー }
非staticのフィールドを使用しないメソッドではstaticにすることで、インスタンス生成をせず素早く使うことが出来ます。