0

当您将它们传递给 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。

在这里,我将 Store 引用传递给 ProducerStore。在 ProducerStore 中,我将它分配给它的类成员。我也在为 ConsumerStore 做同样的事情。

有人可以解释一下如何为 Store 引用完成内存分配以及它是如何在 ProducerStore 和 ConsumerStore 之间共享的吗?

4

2 回答 2

3

你的ProducerStoreConsumerStore都引用了store你传递给每个对象的同一个对象。

因此,当您在外部或任何生产者/消费者中修改store内部状态(其buffer成员)时,所有引用它的类都被“更新”,因为它们不持有不同的值,它们只持有对独特的价值store

如果您完全重新分配对象,则会发生不同的事情。例如:

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

在这种情况下,Consumer 和 Producer 将拥有不同的 store:Consumer 仍然拥有对原始 store 的引用,而 Producer 将拥有在 Put 方法中定义的新 store。

您可以将其视为:每次执行 anew时,都会在内存中创建一个新对象。然后,当您将其传递给类时,每个人都只能引用该唯一对象。

于 2012-11-02T11:50:30.693 回答
1

您需要两个单独的实例。如果您传递相同的引用,那么任何更改都将反映在两个对象上,因为它们指向相同的引用。

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

几条笔记

  • 永远不要使用公共变量。
  • 如果您的设计需要继承,请使用继承

您应该阅读 课程:面向对象的编程概念

于 2012-11-02T11:49:47.383 回答