2012-11-26 26 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