User.java
public class User {
// ユーザー名(インスタンス変数)
private String name;
// 各ユーザーが何回メッセージを送ったか(インスタンス変数)
private int messageCount = 0;
// 全ユーザーで共有されるメッセージ総数(static = クラス変数)
private static int totalMessageCount = 0;
// コンストラクタでユーザー名を受け取って初期化
public User(String name) {
this.name = name;
}
// メッセージ送信時の処理
public void sendMessage() {
messageCount++; // このインスタンス専用のカウントを1増やす
totalMessageCount++; // クラス全体で共通のカウントも1増やす
// 出力(個別の送信回数と、全体の送信回数を両方表示)
System.out.println(name + " の送信回数: " + messageCount + "(全体: " + totalMessageCount + ")");
}
}
Main.java
public class Main {
public static void main(String[] args) {
User u1 = new User("Alice");
User u2 = new User("Bob");
u1.sendMessage(); // Alice: 1(全体: 1)
u2.sendMessage(); // Bob: 1(全体: 2)
u1.sendMessage(); // Alice: 2(全体: 3)
}
}
実行結果
Alice の送信回数: 1(全体: 1)
Bob の送信回数: 1(全体: 2)
Alice の送信回数: 2(全体: 3)
解説
この問題では、インスタンス変数と static(クラス)変数の違いを出力で明確に理解します。
インスタンス変数:messageCount
private int messageCount;
これは 各オブジェクトごとに独立して存在する値です。new User("Alice")
と new User("Bob")
では、それぞれの messageCount
が別々に管理されています。
static変数:totalMessageCount
private static int totalMessageCount;
これは クラス全体で1つしかない変数です。u1.sendMessage()
でも u2.sendMessage()
でも、共通の値が更新されます。
出力結果で差を実感
Alice の送信回数
は、Alice自身のカウント(messageCount
)だけを見ている全体:
の部分は、totalMessageCount
なので すべての送信の合計が出てくる
このように、インスタンス変数とstatic変数が同じように見えてまったく違う役割を持っていることが、出力を通して直感的に理解できます。
まとめ
- インスタンス変数は「それぞれのオブジェクト専用の情報」
- static変数は「すべてのオブジェクトが共有する情報」
static
を使うかどうかは、「その情報を共有したいかどうか」で判断する
Just Keep Typing, Baby!では、この「static修羅道」でつまづいた人向けの解説をしています。こちらもぜひ!
// tesh:
// 自分に聞いてみろ。「わかってる」って言い切れる?