MENU

【Java Silver 試験】static変数とstaticメソッドの理解【変数とメソッド】

今回は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ブロックを使って初期化処理を記述することもできます。

目次