指向同一对象的对象引用

时间:2012-11-26 23:44:46

标签: java class pointers reference

例如,假设我们有一个包含许多字段的类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 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分: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);
    }

}

答案 2 :(得分:0)

这不会发生在单个线程中。 如果您为第二个线程执行c = b,则应用正常的可见性规则。

答案 3 :(得分: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