1-4 変数のスコープの問題
次のコードを確認してください。
class Main{
static int i;
public static void main(String[] args){
int i = 10;
i = set(i);
i = get();
println();
}
static int set(int i){
i = i;
return i++;
}
static int get(){
return i++;
}
static void println(){
System.out.println(i);
}
}
このコードをコンパイル、および実行すると、どのような結果になりますか。
1つ選択してください。
A.0
B.1
C.10
D.11
E.12
《解説》
変数のスコープについての問題です。
2行目ではstatic変数i、5行目ではmain()メソッド内にローカル変数i、10行目では set()> メソッドの引数に変数iと、同名の変数iが3箇所で宣言されています。
それぞれの有効範囲は、2行目の変数iはクラス全体、5行目の変数iはmain()メソッド 内、10行目の変数はset() メソッド内です。
同じ名前の変数が混在する場合は、最も内側のブロックで定義された変数が優先的に使用されます。
5行目では、main()メソッド内で宣言した変数iに10が代入されます。
6行目では、set()メソッドの呼び出し時に、5行目の変数iを渡します。
処理が10行目に移ると、11行目の i = i;はset()メソッドの引数で宣言した変数iに渡されてきた10を、再び引数の変数iに代入しています。
12行目では変数iの値10を戻り値で呼び出し元に返した後、引数で宣言している変数i をインクリメントします。
6行目に返された10は、5行目で宣言した変数iに再代入されます。
7行目では変数iにget()メソッドの戻り値が代入されます。
14行目のget()メソッドでは、変数iを戻り値として返してから、インクリメントします。
15行目の変数iは、2行目で宣言しているstatic変数iを指しています。
つまり、初期値である0を戻り値として返した後に、static変数iをインクリメントするため、2行目の変数iは、1になります。
8行目では、println()メソッドを呼び出し、18行目で変数iを出力します。
18行目の変数iは、2行目のstatic変数iを指しています。get()メソッドでインクリメントされた、変数iの値である「1」を出力します。
したがって、選択肢Bが正解です。
《答え》B