2012-11-02 55 views
0

當您將它們傳遞給Java中的方法時,我對Java中引用的內存分配感到困惑。作爲一個測試我做了如下的例子,傳遞給Java中的類的引用的內存分配和共享

class Store{ 
public int[] buffer = new int[5]; 
} 

class ConsumeStore{ 
Store store; 
public ConsumeStore(Store store){ 
    this.store = store; 
} 

public int useStore(){ 
    return store.buffer[0]; 
} 
    } 

class ProduceStore{ 
Store store; 
public ProduceStore(Store store){ 
    this.store = store; 
} 

public void putStore(){ 
    store.buffer[0] = 100; 
} 
} 

public class CheckRef { 
    public static void main(String args[]){ 
    Store store = new Store(); 
    ConsumeStore consStore = new ConsumeStore(store); 
    ProduceStore prodStore = new ProduceStore(store); 
    prodStore.putStore(); 
    System.out.println(consStore.useStore()); 
    } 
} 

那麼輸出爲100

在這裏,我路過商店參考ProducerStore。 Inside ProducerStore我將它分配給它的類成員。我也爲ConsumerStore做同樣的事情。

有人能解釋我如何爲存儲引用完成內存分配以及它如何在ProducerStore和ConsumerStore之間共享?

+0

我們也是。爲什麼你在第一時間使用公共變量?然後你傳遞相同的引用,這意味着兩個對象將具有相同的引用,因此修改將適用於這兩個對象。 –

+1

我也是。你在問什麼? –

回答

3

無論您ProducerStoreConsumerStore具有相同的對象store一個參考,你傳遞給每個人。

所以當你修改store內部狀態(其buffer成員),或者是通過外部或以任何生產者/消費者,所有有提到它的「更新」,因爲它們不持有不同的值類的,他們只持有對唯一值store的引用。

不同的東西會發生,如果你完全重新分配對象。例如:

public void putStore(){ 
    store = new Store() 
    store.buffer[0] = 100 
} 

在這種情況下,消費者和生產者將有不同的商店:消費者仍然要對原有門店的參考,而生產者將不得不認沽方法中定義新的。

你可以這樣想:每次你做一個new,一個新的對象被創建在內存中。然後,當你將它傳遞給類時,每個人都只能引用那個獨特的對象。

1

您需要兩個獨立的實例。如果您傳遞了相同的引用,則任何更改都會反映在這兩個對象上,因爲它們指向相同的引用。

Store store = new Store(); 
ConsumeStore consStore = new ConsumeStore(store); 
Store anotherStore = new Store(); 
ProduceStore prodStore = new ProduceStore(anotherStore); 

幾個音符

  • 不要使用公共變量。
  • 使用繼承,如果你的設計要求,它

你應該閱讀Lesson: Object-Oriented Programming Concepts

+0

如果你的設計需要繼承,那麼我會爭辯說(但這是我的觀點),那麼你的設計就是廢話。更改。繼承是邪惡的。使用組合。無論如何,有點題外話:) – Guillaume

+0

@Guillaume一切都有它自己的優點和缺點:) –