gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:58:25 27 4
gpt4 key购买 nike

当您将 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com