この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)