当您将 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 之间共享内存吗?
最佳答案
您的 ProducerStore
和 ConsumerStore
都拥有对传递给每个对象的同一个对象 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/