DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

13章62

ご指摘いただいた通り、私の前回のコメントで誤解を招く説明をしてしまいました。お詫び申し上げます。a.sample(); が2回呼ばれることはありません。正しくは、a.sample();b.sample(); がそれぞれ1回ずつ呼ばれているだけです。

正しいコードの解説は以下の通りです:

public class Sample {
    public static void main(String[] args) {
        Test a = new Test(); // Testクラスのインスタンスaを生成
        Test b = new Test(); // Testクラスのインスタンスbを生成

        a.sample(); // インスタンスaでsampleメソッドを呼び出し、valueが0から5になる
        b.sample(); // インスタンスbでsampleメソッドを呼び出し、valueが5から10になる

        // aとbのvalueを表示(両方とも同じstatic変数を参照しているため、どちらも10を出力)
        System.out.println(a.value + ", " + b.value); 
    }
}

class Test {
    static int value = 0; // すべてのTestインスタンスで共有される静的変数
    int count = 0; // 各Testインスタンス固有のカウント変数

    public void sample() {
        while(count < 5) { // countが5未満の間、ループを続ける
            count++; // countを1増やす
            value++; // static変数valueを1増やす(すべてのインスタンスで共有されているため、全体のvalueが増加)
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

こちらが問題文に示されたコードに基づいた正確なコメントです。これにより、Testクラスのvalue変数が静的であるため、全インスタンスで共有されていることが理解できると思います。最終的にvalueは10になります。それをmainメソッドで出力しているため、結果として10, 10が表示されることになります。

追記

インスタンスbsample()メソッドを呼び出した時にvalueが5から10になる理由を説明します。

Testクラスのvalueは静的(static)変数で、このクラスのすべてのインスタンス間で共有されます。初めてa.sample()が呼び出されると、acountは0から始まります。sample()メソッド内のwhileループは、countが5未満である限り繰り返されます。このループ内でcountvalueはそれぞれ1ずつ増加されます。countが5に到達するまでに、valueは0から5へと5回増加されます。

次に、インスタンスbsample()が呼び出されると、bcountも0から始まりますが、valueは前のa.sample()の実行により既に5になっています。b.sample()内でまたwhileループが実行されると、countが再び5に到達するまでvalueが5回増加されます。このため、valueは更に5から10に増加します。

こうして、a.sample()で0から5へ増え、b.sample()で5から10へ増えるため、最終的にvalueの値は10になります。そして、System.out.println(a.value + ", " + b.value);によって、valueの現在値である10が2回表示される結果、「10, 10」と出力されます。

Top comments (0)