今回も問題を解いていきましょう。
問題
次のプログラムを実行した場合の出力はどれでしょうか?正しい選択肢を選んでください。
class Counter {
static int count = 0;
Counter() {
count++;
}
static void reset() {
count = 0;
}
}
public class Main {
public static void main(String[] args) {
Counter c1 = new Counter();
Counter c2 = new Counter();
System.out.println(Counter.count);
Counter.reset();
System.out.println(Counter.count);
}
}
選択肢
- A. 0
0 - B. 1
0 - C. 2
0 - D. コンパイルエラー
答えと解説
回答を見る
答え
C. 2
0
解説
解説のポイント:
- static変数の特性
- staticメソッドの使用
- オブジェクト生成による影響
static変数の特性:
static変数はクラスに属し、クラスで生成されたすべてのインスタンスで共有されます。
そのため、あるインスタンスでstatic変数を変更すると、その後に作成されたすべてのインスタンスにその変更が反映されます。
今回のコードでは、Counterクラスのインスタンスが生成されるたびに、コンストラクタによってcount変数がインクリメントされます。
複数のCounterオブジェクトを生成することで、countの値が累積され、結果として「2」が出力されます。
staticメソッドの使用:
staticメソッドもクラスに属すものであり、クラス名を通じて呼び出すことができます。
コードでは、staticメソッドreset()を使用してcountの値を0にリセットしています。
ここで確認できるように、Counter.reset()は任意のCounterインスタンスからも呼び出すことが可能です。
このメソッドが呼び出されると、すべてのCounterインスタンスが共有するcountが0に設定されるため、出力結果は「0」となります。
オブジェクト生成による影響:
Counterインスタンスが生成されるたびに、countは一意なインスタンスではなく、クラス全体で一度だけ存在するために累積されます。
逆に、非static(インスタンス変数)はそれぞれのインスタンスに独立した状態を持つが、static変数は一つのクラスに一つだけで、すべてのインスタンスがその共通の値を見ています。
この機能を利用すると、同じクラスを通じた状態の共有や、カウンタのような機能実装に役立ちます。