この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 が正しいです。
以下はコードにコメントを付けたバージョンです:
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変数が静的でない場合、次のようになります:
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値とは独立します。