今回も問題を解いていきましょう。
問題
次のプログラムを実行した場合の出力はどれでしょうか?正しい選択肢を選んでください。
public class ScopeExample {
static int x = 5;
public static void main(String[] args) {
int x = 10;
System.out.println("Value of x: " + x);
display();
}
static void display() {
System.out.println("Value of x in display(): " + x);
}
}
選択肢
- A. Value of x: 10 Value of x in display(): 5
- B. Value of x: 5 Value of x in display(): 10
- C. Value of x: 10 Value of x in display(): 10
- D. コンパイルエラー
答えと解説
回答を見る
答え
A. Value of x: 10 Value of x in display(): 5
解説
解説のポイント:
- 変数のスコープ
- ローカル変数と静的変数の違い
このプログラムは、変数のスコープの違いによってどの変数が使われるかを示す例です。
最初に宣言されたstatic int x = 5;
はクラスレベルの静的変数です。これは、クラス全体で利用可能で、アプリケーションのライフサイクル全体で保持されます。
対して、main
メソッド内で定義されたint x = 10;
はローカル変数です。この変数はmain
メソッド内のみで有効です。
メソッドdisplay()
では静的変数x
が使われます。
基本説明: プログラムはmain
メソッドにローカルスコープの変数x
を持ち、System.out.println
で、そのスコープ内の変数が使われるため、最初に「Value of x: 10」が出力されます。その後display
メソッドが呼び出され、静的スコープの変数x
が使用されるため、次に「Value of x in display(): 5」が出力されます。
誤答理由:選択肢Bのように「Value of x: 5 Value of x in display(): 10」となることはありません。ローカル変数x = 10;
はmain
メソッド内に限定されるため、display
メソッド内での変数の値に影響を与えることはできません。
つまずきポイント:変数のスコープと優先順位を理解するのは初心者にとって難しいことがあります。ローカル変数は常にそのスコープ内で優先的に使用されますが、スコープを超えるとその影響はありません。
発展知識:Javaでは同一スコープ内での変数シャドウイングを避けるため、変数名の一貫性に気をつけることが重要です。静的変数はすべてのメソッドからアクセスでき、同じクラス内にスコープが広がりますが、同じ名前のローカル変数はその定義されたメソッド内で優先されます。