今回はJavaでのstatic変数とstaticメソッドについて理解を深めましょう。
問題
次のプログラムを実行すると出力されるのはどれでしょうか?
class Counter {
static int count = 0;
Counter() {
count++;
}
static void displayCount() {
System.out.println("Count: " + count);
}
}
public class Main {
public static void main(String[] args) {
Counter c1 = new Counter();
Counter c2 = new Counter();
Counter.displayCount();
}
}
選択肢
- A. Count: 0
- B. Count: 1
- C. Count: 2
- D. コンパイルエラー
答えと解説
回答を見る
答え
C. Count: 2
解説
基本説明:
static変数はクラス単位で存在し、インスタンス化に依存しません。今回のプログラムでは、Counter
クラスのstatic変数count
は、クラスの全てのインスタンス間で共有されます。
新しいCounter
オブジェクトが生成されるたびに、コンストラクタCounter()
が呼び出され、変数count
がインクリメントされます。
よって異なるインスタンスが生成されてもcount
の値は継続して加算されていきます。
誤答理由:
選択肢AとBは、count
がインクリメントされていない、もしくは1回しか加算されていないという誤解をしています。
static変数であるため、2つの異なるCounter
インスタンスによってインクリメントが行われると、結果は2になります。
選択肢Dのコンパイルエラーは、構文的に正しいプログラムなので不適切です。
つまずきポイント:
staticメンバーの特性を理解していないと、変数がインスタンスごとに別々に管理されると誤解することがあります。
クラス全体で共有されるstatic変数の挙動に注目する必要があります。
発展知識:
staticメンバーの初期化タイミングは、クラスが最初にロードされたときに行われます。これにより、コンストラクタが呼ばれるたびに新たな変数が生成されるインスタンス変数とは異なる動作をします。
staticブロックを使って初期化処理を記述することもできます。