この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値とは独立します。
Top comments (0)