java - Java 中传递给类的引用的内存分配和共享

标签 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。

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

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

最佳答案

您的 ProducerStoreConsumerStore 都拥有对传递给每个对象的同一个对象 store 的引用。

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

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

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

在这种情况下,消费者和生产者将拥有不同的存储:消费者仍将拥有对原始存储的引用,而生产者将在 Put 方法中定义新的存储。

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

关于java - Java 中传递给类的引用的内存分配和共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13194580/

相关文章:

java - 开始Java : passing to a constructor thru event listener

java - Android 和 JFileChooser

java - 使用 Java、Jersey、MongoDB 和 Json 的简单记录器 API

java - 在 Java 中计算 ConcurrentHashmap 中的 delta

java - 如何从 Java 中的 LinkedList 类外部声明 Node 类型?

java - Mybatis : "less than" issue in Select annotations

java - 使用数据库创建 jcomponents

java - 黑莓编程——定时器类

java - 如何在 Eclipse Helios 中引用另一个项目中的库?

带有意外随机数的Java骰子