今回も問題を解いていきましょう。
問題
次のプログラムを実行した場合の出力はどれでしょうか?正しい選択肢を選んでください。
public class Main {
public static void main(String[] args) {
int a = 5;
{
int a = 10;
System.out.println(a);
}
System.out.println(a);
}
}
選択肢
- A. 5 followed by 10
- B. 10 followed by 5
- C. 10 followed by 10
- D. コンパイルエラー
答えと解説
回答を見る
答え
D. コンパイルエラー
解説
解説のポイント:
- 変数スコープとは?
- ローカル変数のシャドーイングとコンパイルエラー
スコープは変数が有効な範囲を指します。Javaでは、変数はその宣言されたブロック内でのみ有効です。スコープが異なる、つまり別のコードブロックで同じ変数名を使うことができ、これをシャドーイング(影書き)といいます。
このプログラムでは、変数a
が最初にmain
メソッド内で宣言され、次に別のブロックで再びa
が宣言されています。この形は意図的なシャドーイングですが、実行時に問題ではなくコンパイル時にエラーとなります。
誤答しやすいポイントは、このシャドーイングが許されると思ってしまうことです。しかし、スコープ内(この場合はメソッド内)では、同名の変数を再宣言することはできません。
発展知識として知っておくとよいのは、Javaコンパイラは変数の重複宣言を防ぎ、意図せぬバグを避けようとしているということです。シャドーイング自体は有効な操作で、複数のネストしたブロックで必要に応じて異なる目的で変数を使い回すために利用しますが、その場合には各変数がそれぞれのスコープ内に完全に独立して存在する必要があります。