2013-03-10 4 views
0

자바가 객체 참조와 함께 작동하는 방식을 제대로 이해하지 못한다고 생각합니다. 내가 생각으로 여기에 내가 뭔가를 실현 문제의 예 작동하지 않는 :자바 객체 참조 문제

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 개의 개체가 있습니다. 주어진 인덱스를 사용하여 더 일반화하기 위해서는 해당 오브젝트를 unequip합니다. 그것을 위해, 나는 그것을 수정하기 위해 unequip하고 싶은 오브젝트를 복사합니다. 국가는 여기 중요하지 않습니다. 요점은, 내가 "ui = null"의 배정을 할 때 원래 객체가 null이 될 것이라고 생각했기 때문입니다. 객체를 UI에 할당하는 순간 둘 다 같은 참조이며 변경 사항이 동시에 두 가지 모두에 영향을 줄 것이라는 점을 두 가지 중 하나를 편집하십시오 ...

이 미스 테넌시를 도와 줄 수 있습니까? 감사!

+1

두 참조 중 하나를 null로 지정하면 다른 참조는 여전히 유효합니다. 두 참조 중 하나에서 메소드를 호출하면 원래 오브젝트의 데이터가 변경됩니다 (둘 다 참조되는 것). –

답변

1

ui은 로컬 변수입니다. null (으)로 변경할 수 있습니다. 코드의 다른 변수에는 영향을주지 않습니다. 나중에 ui을 지정하여 다른 항목 중 하나를 참조하고 그 항목으로 작업하십시오.

참고로 배열이나 목록을 사용하는 것이 좋습니다. 이렇게하면 항목을 쉽게 검색 할 수 있습니다 (if..else if..else의 무리가 아니라 한 줄). 또한 나중에 그렇게하기로 결정한 경우 인벤토리에 "슬롯"을 더 쉽게 추가 할 수 있습니다.

+0

그래, 음, 이유가 있기 때문에 이런 식으로 만들어졌다. 오해에 대해, 네, 제가 참고 문헌에 대해 너무 많이 생각하고 있었다고 생각합니다. 그것은 맹렬했다! – Frion3L

0

개체를 null로 설정할 수 없습니다. 예, uinull으로 설정했지만 ui는 개체에 대한 하나의 참조 일뿐입니다. 다른 개체가 원본 개체를 참조 할 수 있습니다. 객체 자체는 이것의 영향을받지 않습니다.

원본 개체에 대한 참조가없는 경우에만 가비지 수집됩니다.