例如,假设我们有一个包含许多字段的类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
不递增。
任何人都可以向我解释为什么会这样吗?这种效果是我想要发生的,因此任何关于如何实现这一点的建议都会非常有用(一般例子很好)。
答案 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