-3

例如,假设我们有一个Board包含许多字段的类(即一个相当复杂的类)。我们像这样实例化一个 Board:

Board b = new Board();

请注意,为了这个示例,我没有在构造函数中输入任何参数,尽管在实际示例中,这些参数可能是必需的。如果我们要实例化一个新的 Board 实例并将其设置为如下所示:

Board c = b;

这实际上不会创建一个新板。据我所知,c现在b指向同一个内存区域,同一个 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

这不会发生在单个线程中。如果您为第二个线程执行 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 回答