1-1 変数のスコープの問題

次のコードを確認してください。

class Scopetest{
    int num;
    public static void main(String[] args){
        Scopetest test = new Scopetest();
        int num = 0;
        System.out.print(num);
        test.foo();
        System.out.print(num);
        System.out.print(test.num);
    }
    void foo(){
        int num = 1;
        bar();
        System.out.print(num);
    }
    void bar(){
        num = 2;
    }
}

このコードをコンパイル、および実行すると、どのような結果になりますか。

1つ選択してください。

A.0100

B.0101

C.0102

D.0112

《解説》

スコープとは変数の有効範囲のことです。ソースコード内の{}で囲まれた部分をブロックと呼びます。

ブロック内で宣言した変数は、宣言したブロック内でのみ使用できます。 ブロック内で宣言した変数をローカル変数と呼びます。

5行目では、変数num を宣言し、0を代入しているため、6行目では「0」と出力されます。

7行目では、foo()メソッドを呼び出しているため、11行目に処理が移ります。

12行目で宣言した変数numはfoo()メソッドの内部でのみ有効なローカル変数です。

そのため、 14行目では「1」と出力されます。

8行目では、再び変数num を出力しています。8行目で使用できる変数numは、5行目の変数numです。よって「0」と出力されます。

9行目では「2」と出力されます。13行目でbar()メソッドを呼び出した際に、17行目に処理が移ると、2行目で宣言しているメンバ変数numに2を代入しているためです。

したがって、実行結果は「0102」と出力されるため、選択肢Cが正解です。

《答え》C