DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

6章5

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

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

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

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

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

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

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

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

  8. Sample.num の値を出力しています。最終的に num30 になっているので、コンソールには 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)をコンソールに出力
    }
}
Enter fullscreen mode Exit fullscreen mode

プログラムの実行結果は、コンソールに 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
    }
}
Enter fullscreen mode Exit fullscreen mode

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

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

Top comments (0)