0

Javaがオブジェクト参照を処理する方法を正しく理解していないと思います。これは、何かが思ったように機能していないことに気付いた問題の例です。

public void UnequipObject(int index) {

    UsableItem ui = null;

    if(index == 0) ui = item1;
    else if(index == 1) ui = item2;
    else if(index == 2) ui = item3;

    if(ui != null)
    {
        int itemId = ui.GetId();            
        State.Instance().AddItem(itemId, 1);            
        ui = null;
    }
}

この機能は、キャラクターのオブジェクトを装備解除します(私はビデオゲームを開発しています)。各キャラクターは最大 3 つのオブジェクトを持ちます。より汎用的にするには、特定のインデックスを使用して、そのオブジェクトの装備を解除します。そのために、装備を外して変更を加えたいオブジェクトを ui にコピーします。ここでは州は重要ではありません。ポイントは、「ui = null」の割り当てを行うと、元のオブジェクトもnullになると想定されていたため、オブジェクトをuiに割り当てた瞬間に両方が同じ参照であり、変更が両方に同時に影響するように、両方のいずれかを編集します...

この誤解について誰か助けてくれませんか?ありがとう!

4

2 に答える 2

1

uiローカル変数です。この変数を に設定しているだけですnull。コード内の他の変数には影響しません。ui後で、他の項目の 1 つを参照し、それを使用して何かを行うように割り当てます。

ちなみに、配列またはリストを使用することを強くお勧めします。これにより、アイテムの取得が容易になります (if.​​.else if..else の束ではなく、1 行で済みます)。また、将来そうすることにした場合に、インベントリに「スロット」を追加しやすくなります。

于 2013-03-10T00:21:35.503 に答える
0

オブジェクトをnullに設定することはできません。はい、に設定uiしましnullたが、uiはオブジェクトへの1つの参照にすぎません(他の人が元のオブジェクトを参照している場合があります)。オブジェクト自体はこれによる影響を受けません。

元のオブジェクトへの参照がない場合にのみ、ガベージコレクションが行われます。

于 2013-03-10T00:24:12.073 に答える