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