DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

13章11

このJavaのコードを見ると、num という名前の private static int 変数があります。この変数には、二つの静的ブロックを通じて異なる値が割り当てられています。最初の静的ブロックでは num に10が割り当てられ、二つ目の静的ブロックでは num に20が割り当てられます。

静的ブロックは、クラスがJVMによってロードされる時に実行され、クラスのロード時に一度だけ実行されます。もし複数の静的ブロックがある場合、それらはクラスに書かれた順番に実行されます。

ここで重要なのは、test メソッドが受け取る num パラメータはメソッドのローカル変数であり、クラス変数 num とは異なります。test メソッド内で num に対する演算は、このローカル変数にのみ影響し、クラス変数 num は変更されません。

main メソッドから test(num); を呼び出すときには、num の値が20になっています(二つ目の静的ブロックで設定された値)。しかし、test メソッド内での計算結果は、クラス変数 num には反映されません。したがって、System.out.println(num); が出力するのは、最後に割り当てられた num の値、つまり20です。

コメントアウトを加えたコードは以下の通りです:

public class Main {
    private static int num; // クラスレベルの静的変数

    static {
        num = 10; // 最初の静的ブロックでnumに10を割り当てる
    }

    static {
        num = 20; // 二つ目の静的ブロックでnumに20を割り当てる(この値が保持される)
    }

    // testメソッドは、与えられた引数であるnumの値を二乗するが、これはクラス変数numとは別のローカル変数numである
    static void test(int num) {
        num = num * num; // この演算結果はローカル変数にのみ影響し、クラス変数numには影響しない
    }

    public static void main(String[] args) {
        test(num); // クラス変数num(値は20)をtestメソッドに渡す
        System.out.println(num); // クラス変数numの値を出力する(結果は20)
    }
}
Enter fullscreen mode Exit fullscreen mode

したがって、出力される答えは20であり、選択肢Bが正しいです。選択肢Aが正しいとの記載がありますが、実際にはBが正しいというのがこのコードの挙動です。もし、選択肢のラベリングに誤りがある場合はそれを考慮する必要があります。

Top comments (0)