-3

たとえば、Board多くのフィールドを持つクラス (つまり、かなり複雑なクラス) があるとします。次のように Board をインスタンス化します。

Board b = new Board();

この例では、コンストラクターにパラメーターを入力していませんが、実際の例ではパラメーターが必要になる場合があります。次に、Board の新しいインスタンスをインスタンス化し、それを次のように設定するとします。

Board c = b;

これは、実際には新しいボードを作成しません。私が知っていることからcb今は同じメモリ領域、同じ Board オブジェクトを指しています。したがって、 について何かを変更するとしたらb、次のように整数フィールドをインクリメントするとします。

b.count++;//Assume count is an integer field in the Board class.

c.countもインクリメントする必要があります。ただし、これを自分で行うと、うまくいきません。 b.count増加していますが、まだ増加していませc.countん。
なぜこれが起こるのか、誰かが私に説明できますか? この効果は私が実現したいものです。したがって、これを実装する方法についてのアドバイスは非常に役に立ちます (一般的な例は問題ありません)。

4

4 に答える 4

2

また違う:

package cruft;

/**
 * Board description here
 * @author Michael
 * @link
 * @since 11/26/12 6:46 PM
 */
public class Board {

    public int count;

    public static void main(String[] args) {
        Board b = new Board();
        Board c = b;
        System.out.println("b before: " + b);
        System.out.println("c before: " + c);

        ++b.count;

        System.out.println("b after : " + b);
        System.out.println("c after : " + c);
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder();
        sb.append("Board");
        sb.append("{count=").append(count);
        sb.append('}');
        return sb.toString();
    }
}
于 2012-11-26T23:48:14.343 に答える
1

これは起こるべきではありません。この例を見てください。

public class Board {

    public Integer count = 0;

    public static void main(String[] args)
    {
        Board b = new Board();
        Board c = b;

        c.count++;

        System.out.println("b.count="+b.count);
        System.out.println("c.count="+c.count);
    }

}
于 2012-11-26T23:49:35.137 に答える
0

これはシングルスレッドでは発生しません。2番目のスレッドに対してc=bを実行すると、通常の可視性ルールが適用されます。

于 2012-11-26T23:49:54.573 に答える
0

まず、publicオブジェクトでフィールドを使用しないようにする必要があります。privateフィールドを使用してからgetFieldName()、とsetFieldName(FieldType arg)メソッドを使用します。そうすれば、何が起こるかをより細かく制御でき、特定の変数が変更されたときに他のことを起こさせたい場合は、コードを追加できます。

そうは言っても、コードにバグがあるはずです。理由は次のとおりです。

public static void main(String[] args) {
    Board b = new Board();
    Board c = b;

    System.out.println("BEFORE++: b.count = " + b.count);
    System.out.println("BEFORE++: c.count = " + c.count);

    b.count++;

    System.out.println("AFTER++: b.count = " + b.count);
    System.out.println("AFTER++: c.count = " + c.count);
}

public static class Board {
    public int count = 0;
}

出力:

BEFORE++: b.count = 0
BEFORE++: c.count = 0
AFTER++: b.count = 1
AFTER++: c.count = 1
于 2012-11-26T23:50:07.013 に答える