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