Java の static フィールドと static メソッド(クラス全体で共有する)
新人
「先輩、Javaでstaticってよく見かけますけど、何の意味があるんですか?」
先輩
「いい質問だね。staticはクラス全体で共有できる特別な仕組みなんだ。変数やメソッドの前につけて使うんだよ。」
新人
「クラス全体で共有ってどういうことですか?インスタンスを作らなくても使えるってことですか?」
先輩
「そのとおり!じゃあこれから、staticの意味や使い方を、わかりやすく説明していくよ。」
1. staticとは?Javaでの意味をやさしく解説
Javaのstaticとは、「クラスに属する」という意味です。通常、変数やメソッドはオブジェクト(インスタンス)を作ってから使いますが、staticをつけることで、クラス全体で共通して使えるようになります。
たとえば、すべての人に共通する情報(学校名など)をクラス全体で共有したいときに、staticを使うと便利です。
初心者向けに言えば、「staticがついたものは、オブジェクトを作らなくても使える」と覚えておくとよいでしょう。
次のサンプルコードを見てみましょう。
public class School {
static String schoolName = "さくら中学校";
static void printSchoolName() {
System.out.println("学校名:" + schoolName);
}
}
この例では、schoolNameもprintSchoolName()もstaticがついています。つまり、クラス全体で共有される情報として定義されているということです。
このような使い方を覚えておくと、Javaのクラス設計がとても楽になります。初心者でも安心して使える仕組みなので、ぜひ覚えておきましょう。
2. staticフィールドとは?クラス全体で共有する変数のしくみ
staticフィールドとは、クラスのすべてのインスタンスで共通して使われる変数のことです。ふつうの変数(インスタンス変数)は、オブジェクトごとに値を持っていますが、staticをつけると全員で同じ値を使うことになります。
たとえば、生徒の情報を表すクラスがあるとしましょう。学校名はみんな同じなので、staticで共有すればよいのです。
public class Student {
String name;
static String schoolName = "さくら中学校";
void printInfo() {
System.out.println("名前:" + name);
System.out.println("学校:" + schoolName);
}
}
このクラスを使って、実際にオブジェクトを作ってみましょう。
public class Main {
public static void main(String[] args) {
Student s1 = new Student();
s1.name = "たろう";
Student s2 = new Student();
s2.name = "はなこ";
s1.printInfo();
s2.printInfo();
}
}
名前:たろう
学校:さくら中学校
名前:はなこ
学校:さくら中学校
このように、schoolNameは両方の生徒で同じ値になっています。これはstaticによって、クラス全体で共有されているからです。
さらに、staticフィールドはクラス名を使ってアクセスすることもできます。次のように書けます。
Student.schoolName = "ひまわり高校";
こうすることで、すべての生徒の学校名が一気に変わります。
初心者向けにポイントをまとめると、
- staticフィールドは全員で共通
- クラス名.フィールド名でアクセスできる
- インスタンスを作らなくても使える
このように、Javaのstaticフィールドは、とても便利な仕組みです。Pleiadesの開発環境でぜひ動かして試してみましょう。
3. staticメソッドとは?インスタンスを作らず使える処理
Javaのstaticメソッドは、オブジェクトを作らなくても使える特別なメソッドです。ふつうのメソッドはインスタンス(実体)を作ってから呼び出しますが、staticがついたメソッドはクラス名を使って直接呼び出すことができます。
たとえば、簡単なあいさつをするメソッドをstaticとして定義してみましょう。
public class Greeting {
static void sayHello() {
System.out.println("こんにちは!");
}
}
このsayHello()メソッドはstaticがついているので、次のようにクラス名だけで呼び出すことができます。
public class Main {
public static void main(String[] args) {
Greeting.sayHello();
}
}
こんにちは!
このように、staticメソッドはとてもシンプルに使えるため、共通の処理や便利な機能をまとめたいときに役立ちます。
4. staticの実践例(フィールド・メソッドの組み合わせ)
ここでは、staticフィールドとstaticメソッドを組み合わせた実践的な使い方を見てみましょう。クラス全体で使いたいデータと、それを操作する処理をまとめて管理できます。
例として、生徒の人数をカウントする仕組みを作ってみましょう。
public class Student {
static int count = 0;
String name;
Student(String name) {
this.name = name;
count++;
}
static void showCount() {
System.out.println("生徒数:" + count + "人");
}
}
このコードでは、countというstaticフィールドが、生徒が作られるたびに1ずつ増えていきます。そして、showCount()というstaticメソッドでその数を表示できます。
public class Main {
public static void main(String[] args) {
new Student("たろう");
new Student("はなこ");
new Student("ゆうた");
Student.showCount();
}
}
生徒数:3人
このように、staticを使えば、すべてのオブジェクトで共通する情報や機能を、ひとつの場所にまとめることができます。これはJavaのクラス設計においてとても重要な考え方です。
5. staticを使うときの注意点(間違いやすいポイント)
便利なstaticですが、使い方を間違えるとトラブルの原因になります。ここでは初心者向けに、よくある注意点を紹介します。
1. staticメソッドの中では、インスタンスの変数を使えない
staticメソッドはクラスに属しているため、インスタンス(オブジェクト)の情報には直接アクセスできません。
public class Sample {
int number = 10;
static void showNumber() {
System.out.println(number); // エラーになる!
}
}
このように、staticメソッドの中でnumberというインスタンス変数を使おうとすると、コンパイルエラーになります。
もし使いたい場合は、オブジェクトを作ってからアクセスする必要があります。
Sample s = new Sample();
System.out.println(s.number); // OK
2. staticフィールドの変更はすべてのインスタンスに影響する
staticフィールドはクラス全体でひとつしかないため、どこかで変更すると、すべてのオブジェクトに影響が出ます。
Student.schoolName = "ひまわり高校";
このように学校名を変更すると、すべての生徒の情報が変わってしまうので、意図しない影響が出ないよう注意が必要です。
3. staticをむやみに使わない
なんでもstaticにすると、逆にプログラムがわかりにくくなってしまいます。あくまで「全体で共有したい情報」や「どのインスタンスにも関係ない処理」にだけ使うようにしましょう。
Java初心者のうちは、「このデータはみんなで使うものか?」と考えてからstaticをつける習慣をつけることが大切です。
6. staticの使いどころ(どんな場面で便利?)
Javaのstaticは、クラス全体で共有したいデータや処理をまとめるのに便利です。ここでは、実際にどんな場面で役立つのかを紹介します。
1. 定数の定義に使う
プログラムの中で変わらない値(定数)を使いたいとき、staticとfinalを組み合わせて使います。
public class Config {
static final String VERSION = "1.0.0";
}
このように書けば、Config.VERSIONのようにして、どこからでも同じ値を参照できます。定数を一か所にまとめたいときに便利です。
2. 共通の処理をまとめたいとき
複数のクラスや場所で使う処理(たとえば、日付のフォーマットや計算処理など)をstaticメソッドとして定義すると、わざわざオブジェクトを作らずに呼び出せて便利です。
public class MathUtil {
static int add(int a, int b) {
return a + b;
}
}
このaddメソッドはMathUtil.add(3, 5)のように使えます。共通のツールを作るときにぴったりです。
3. オブジェクトの管理
オブジェクトの数をカウントするなど、プログラム全体で一元的に管理したい情報をstaticで扱うと、すっきりとしたコードになります。
このように、staticは「共通で使いたいかどうか」で判断するのがポイントです。初心者のうちは、まずは「定数」「共通処理」「共有データ」に絞って使うとよいでしょう。
7. staticを使ったサンプルコード(クラス全体での共通機能)
ここでは、staticの理解を深めるために、ひとつのクラスの中にstaticフィールドとstaticメソッドを組み合わせて使う例を紹介します。
今回は、ログを記録する仕組みを作ってみましょう。アプリ全体で使えるログ機能をstaticで定義します。
public class Logger {
static String log = "";
static void addLog(String message) {
log += message + "\n";
}
static void showLog() {
System.out.println("ログ一覧:");
System.out.println(log);
}
}
このLoggerクラスは、アプリのどこからでもログを追加・表示できます。staticだからこそ、毎回オブジェクトを作らずに共通して使えます。
public class Main {
public static void main(String[] args) {
Logger.addLog("アプリを起動しました");
Logger.addLog("ログイン成功");
Logger.showLog();
}
}
ログ一覧:
アプリを起動しました
ログイン成功
このように、Javaのstaticは「みんなで使いたいもの」をひとまとめにできる便利な仕組みです。初心者でも使いやすく、特に設定情報や共通処理、アプリ全体の記録などに向いています。
Pleiadesでこのコードを入力して実行してみると、staticのしくみが自然と理解できるようになります。ぜひ実際に試してみましょう。