このJavaのコードでは、クラスSampleがあり、その中にはint型の変数aとbが定義されています。また、このクラスにはSampleコンストラクタとinitメソッドがあります。これらの動作を説明します。
1. public class Sample { // Sampleクラスの定義
2. int a, b; // クラス内の変数aとbを定義
3. public Sample(int a, int b) { // コンストラクタ
4. init(a, b); // initメソッドを呼び出し
5. }
6. public void init(int a, int b) { // initメソッドの定義
7. this.a = a * a; // 渡された引数aの二乗をthis.aに代入
8. this.b = b * b; // 渡された引数bの二乗をthis.bに代入
9. }
10. public static void main(String[] args) { // mainメソッド
11. int a = 2, b = 3; // ローカル変数aとbを定義し、それぞれ2と3で初期化
12. Sample s = new Sample(a, b); // Sampleクラスのインスタンスを生成
13. System.out.println(a + ", " + b); // ローカル変数aとbの値を出力
14. }
15. }
解説
-
mainメソッドが実行されると、aとbというローカル変数が2と3で初期化されます。 -
Sampleクラスのインスタンスsが生成され、コンストラクタが呼ばれます。 - コンストラクタは
initメソッドを呼び出し、引数としてローカル変数aとb(値は2と3)を渡します。 -
initメソッドでは、引数aとbがそれぞれ自身の二乗に更新され、クラスのフィールドaとbに格納されます。つまり、this.a = 4、this.b = 9。 - 最後に、
mainメソッドでSystem.out.println(a + ", " + b);が実行されます。ここで出力されるのはmainメソッド内のローカル変数aとbの値であるため、結果は2, 3です。
このため、答えはC. [2, 3] と表示される、となります。
追記
System.out.printlnで使われる値が、コンストラクタやinitメソッドで更新されたクラスのフィールドaとbではなく、mainメソッドのローカル変数aとbである理由は、スコープの違いに基づいています。
Javaでは、変数のスコープ(つまりその変数が有効な範囲)が重要な役割を果たします。mainメソッド内で定義されたaとb(値は2と3)は、そのメソッドのローカルスコープに限定されています。これらの変数はメソッドの中でのみ有効で、メソッドの実行が終了すると、これらの変数への参照も終了します。
一方で、Sampleクラスのインスタンスが持つaとbはクラスのフィールドです。これらはinitメソッドによってその値が変更され(2の二乗と3の二乗)、インスタンスが生存している限り、どこからでも参照される可能性があります。
System.out.println(a + ", " + b);の行で出力されるのは、mainメソッドのローカル変数aとbの値です。クラスのフィールドを参照するには、そのインスタンスを通じてアクセスする必要があります。例えば、System.out.println(s.a + ", " + s.b);と記述すれば、Sampleクラスのフィールドaとbの更新された値(4と9)が出力されます。
Top comments (0)