2012-11-26 28 views
-3

比方说,我们有一个类Board与许多领域(即相当复杂的类)。我们实例化一个董事会,像这样:指向同一对象的对象引用

Board b = new 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

能否请您发布的例子重现它 –

+1

我_really_看到这个例子。 –

+1

每个答案都有相同的例子......我开始怀疑我是否看不到OP问题中的代码。 – dreamcrash

回答

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

要获得技术,它应该是'b.count ++;' –

+0

不,我的方式工作得很好。 – duffymo

+0

是的,但与OP提供的代码不同。 –

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); 
    } 

} 
0

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

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