6章5

RMAG news

このJavaプログラムのコードは以下の動作をしています:

Sample という名前のクラスを定義しており、static int num という静的変数(クラス変数)を宣言して0で初期化しています。静的変数はクラスの全インスタンス間で共有されます。

Main クラスに main メソッドがあり、プログラムの実行開始点です。

main メソッド内で、Sample.num に 10 を代入しています。これにより、Sample クラスの静的変数 num は 10 になります。

Sample クラスのインスタンス s を生成していますが、このインスタンス生成は num 変数には影響しません。

別の Sample クラスのインスタンス s2 を生成しています。これも num 変数には影響しません。

インスタンス s を介して num に 10 を足しています。num は静的変数なので、これにより num は 20 になります。

インスタンス s2 を介して num に 30 を代入しています。num は静的変数なので、これにより num は 30 に上書きされます。

Sample.num の値を出力しています。最終的に num は 30 になっているので、コンソールには 30 と表示されます。

ここでの選択肢は、実行結果として何がコンソールに表示されるかについて尋ねており、正解は 30 が表示されることです。したがって、選択肢 C が正しいです。

以下はコードにコメントを付けたバージョンです:

public class Sample {
static int num = 0; // クラス変数numの宣言と0での初期化
}

public class Main {
public static void main(String[] args) {
Sample.num = 10; // クラス変数numに10を代入
Sample s = new Sample(); // Sampleクラスのインスタンスsを生成(numには影響なし)
Sample s2 = new Sample(); // 別のSampleクラスのインスタンスs2を生成(numには影響なし)
s.num += 10; // インスタンスsを介してnumに10を加算(numは20になるが、次の行で上書きされる)
s2.num = 30; // インスタンスs2を介してnumに30を代入(numは30に上書きされる)
System.out.println(Sample.num); // クラス変数numの値(30)をコンソールに出力
}
}

プログラムの実行結果は、コンソールに 30 が表示されることです。
回答はC。

追記

staticでない場合、変数はインスタンス変数となり、各インスタンスは独自のnumのコピーを持ちます。そのため、一つのインスタンスの変数の値を変更しても、他のインスタンスの同じ名前の変数には影響しません。

例えば、Sampleクラスのnum変数が静的でない場合、次のようになります:

public class Sample {
int num = 0; // これはインスタンス変数です。
}

public class Main {
public static void main(String[] args) {
Sample s = new Sample();
Sample s2 = new Sample();

s.num = 10; // sのインスタンスのnumのみを10に設定
s.num += 10; // sのインスタンスのnumにさらに10を加え、sのnumは20になる
s2.num = 30; // s2のインスタンスのnumを30に設定、sのnumには影響しない

System.out.println(s.num); // sのnumの値は20
System.out.println(s2.num); // s2のnumの値は30
}
}

この場合、s.numとs2.numは互いに独立しており、s.numに加算や代入を行ってもs2.numには影響しません。そのため、sのnumを印刷すると20が、s2のnumを印刷すると30が表示されます。

static修飾子がなければ、numはそれぞれのSampleオブジェクトに固有の値を持ち、他のオブジェクトのnum値とは独立します。

Leave a Reply

Your email address will not be published. Required fields are marked *