DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

13章49

このJavaのコードでは、クラスSampleがあり、その中にはint型の変数abが定義されています。また、このクラスには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. }
Enter fullscreen mode Exit fullscreen mode

解説

  1. mainメソッドが実行されると、abというローカル変数が2と3で初期化されます。
  2. Sampleクラスのインスタンスsが生成され、コンストラクタが呼ばれます。
  3. コンストラクタはinitメソッドを呼び出し、引数としてローカル変数ab(値は2と3)を渡します。
  4. initメソッドでは、引数abがそれぞれ自身の二乗に更新され、クラスのフィールドabに格納されます。つまり、this.a = 4this.b = 9
  5. 最後に、mainメソッドでSystem.out.println(a + ", " + b);が実行されます。ここで出力されるのはmainメソッド内のローカル変数abの値であるため、結果は2, 3です。

このため、答えはC. [2, 3] と表示される、となります。

追記

System.out.printlnで使われる値が、コンストラクタやinitメソッドで更新されたクラスのフィールドabではなく、mainメソッドのローカル変数abである理由は、スコープの違いに基づいています。

Javaでは、変数のスコープ(つまりその変数が有効な範囲)が重要な役割を果たします。mainメソッド内で定義されたab(値は2と3)は、そのメソッドのローカルスコープに限定されています。これらの変数はメソッドの中でのみ有効で、メソッドの実行が終了すると、これらの変数への参照も終了します。

一方で、Sampleクラスのインスタンスが持つabはクラスのフィールドです。これらはinitメソッドによってその値が変更され(2の二乗と3の二乗)、インスタンスが生存している限り、どこからでも参照される可能性があります。

System.out.println(a + ", " + b);の行で出力されるのは、mainメソッドのローカル変数abの値です。クラスのフィールドを参照するには、そのインスタンスを通じてアクセスする必要があります。例えば、System.out.println(s.a + ", " + s.b);と記述すれば、Sampleクラスのフィールドabの更新された値(4と9)が出力されます。

Top comments (0)