今日は変数のスコープについての問題を解いていきましょう。
問題
以下のプログラムを実行した場合、出力される結果はどれでしょうか?最適な選択肢を選んでください。
public class ScopeExample {
public static void main(String[] args) {
int a = 5;
if (a > 0) {
int b = 10;
System.out.println("b: " + b);
}
System.out.println("a: " + a);
// System.out.println("b: " + b); // こちらの行を実行するとどうなるでしょうか?
}
}
選択肢
- A. b: 10
a: 5
コンパイルエラーなし - B. b: 10
a: 5
コンパイルエラー - C. コンパイルエラーのみ
- D. 出力なし
答えと解説
回答を見る
答え
B. b: 10
a: 5
コンパイルエラー
解説
基本説明:
「スコープ」とは、変数がその値を参照できる範囲のことです。プログラムでは、変数が定義されたブロック内でのみ、その変数を参照することができるルールがあります。
「ブロック」とは、一対の波括弧「{ }」で囲まれた部分を指します。ブロック内で定義された変数は、通常そのブロックを出るとアクセスできなくなります。
この問題では、変数bはif文のブロック内で定義されています。そのため、if文ブロックの外ではbを参照することができません。
誤答理由:
選択肢Aについて:この選択肢では、bが正常に表示されるとしていますが、bはブロック外でアクセスできないためコンパイルエラーが発生します。
選択肢Cについて:コンパイルエラーのみとありますが、変数のaの表示は正常に動作しますので不正解です。
つまずきポイント:
初心者が特に見落としがちな点は、変数bと変数aの扱いの違いです。プログラム冒頭で定義された変数aは、メソッド全体のどこからでも参照可能ですが、if文内で扱うbはそうではありません。
こうしたブロックの内外の違いが実行時やコンパイル時にどのように影響を及ぼすのかを実際に経験することで、理解が深まります。
発展知識:
スコープに関する発展的な事柄としては、Javaでは変数の範囲が異なる非常に多くの状況があります。
例えば、ループ文で使用される変数のスコープや、他のメソッド内で宣言された変数についても同様のルールが適用されます。
また、クラス内で定義されるメンバ変数についても、同様にスコープとアクセスのルールがあります。プライベートのメンバ変数は同じクラス内のみでアクセスが許されます。