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

との両方に、ProducerStoreそれぞれに渡しConsumerStoreた同じオブジェクトへの参照があります。store

したがって、外部またはプロデューサー/コンシューマーのいずれかでstore内部状態(そのbufferメンバー)を変更すると、それを参照するすべてのクラスは、明確な値を保持しないため「更新」され、への参照のみを保持します。一意の値store

オブジェクトを完全に再割り当てすると、別のことが起こります。例えば:

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

この場合、コンシューマーとプロデューサーは異なるストアを持ちます。コンシューマーは元のストアへの参照を持ちますが、プロデューサーはPutメソッド内で定義された新しいストアを持ちます。

これは次のように考えることができます。を実行するたびnewに、新しいオブジェクトがメモリ内に作成されます。次に、それをクラスに渡すと、誰もがその一意のオブジェクトへの参照のみを持ちます。

于 2012-11-02T11:50:30.693 に答える
1

2つの別々のインスタンスが必要です。同じ参照を渡すと、同じ参照を指しているため、変更は両方のオブジェクトに反映されます。

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

いくつかのメモ

  • パブリック変数は絶対に使用しないでください。
  • 設計で必要な場合は継承を使用します

レッスン:オブジェクト指向プログラミングの概念を読む必要があります

于 2012-11-02T11:49:47.383 に答える