자바에서 객체를 삭제 하시겠습니까?


99

내가 만든 개체 (당신을 따르는 타원)를 삭제하고 싶지만 어떻게해야합니까?

delete follower1;

작동하지 않았습니다.

편집하다:

좋아요, 좀 더 맥락을 알려 드리겠습니다. 나는 당신이 조종 할 수있는 타원과 당신을 따르는 타원으로 작은 게임을 만들고 있습니다. 이제 DrawPanel.class라는 파일이 있습니다.이 클래스는 화면의 모든 것을 그리고 충돌, 사운드 등을 처리합니다. 플레이어를 따르는 타원 인 적군. 클래스가 있습니다. 제어 할 수있는 플레이어 인 entity.class가 있습니다. 그리고 플레이어가 팔로워와 교차하면 플레이어 개체를 삭제하고 싶습니다. 내가하는 방식 :

    public void checkCollisions(){
    if(player.getBounds().intersects(follower1.getBounds())){
        Follower1Alive = false;
        player.health = player.health - 10;
    }
}

1
좀 더 컨텍스트를 제공 할 수 있습니까?
Joseph Weissman

2
Java에서는 개체 삭제가 없습니다. 그러나 일반적으로 그럴 필요는 없습니다. 화면에 더 이상 아무것도 표시되지 않도록하는 것이 필요합니다 ( "팔로우하기"가 수행하는 작업 인 경우).
Paŭlo Ebermann 2011

가비지 수집기가 개체를 제거하도록 강제하고 싶습니까? 여기에 이미 질문이 있습니다 . 아니면 다른 것을 시도하고 있습니까? 여기 또는 여기 에서 가비지 수집기에 대해 조금 읽어 볼 수 있습니다. 그래도 도움이되지 않으면 좀 더 구체적으로 설명해야합니다.
Fawix 2011


정말로 수동으로 객체 할당을 처리하고 싶다면 JNI를 사용하십시오. 자바 코드에서 사용되지만 모든 작업 (생성, 삭제 등)을 자체적으로 수행하는 C / C ++ lib를 생성합니다.하지만 lib 내에는 C /가 있습니다. C ++ 코드, Java 없음. Java 객체를 수동으로 삭제하는 방법을 본 적이 없습니다. 프로파일 러가 문제가 있다고 알려 주면 이러한 문제는 종종 객체에 대한 "잊혀진"참조를 기반으로합니다. 귀하의 경우 어디에도 문제가없는 것 같습니다.
Johannes

답변:


171

null을 할당하거나 선언 된 블록을 그대로 두어 참조를 제거해야합니다. 그 후 가비지 수집기에 의해 자동으로 삭제됩니다 (즉시가 아니라 결국).

예 1 :

Object a = new Object();
a = null; // after this, if there is no reference to the object,
          // it will be deleted by the garbage collector

예 2 :

if (something) {
    Object o = new Object(); 
} // as you leave the block, the reference is deleted.
  // Later on, the garbage collector will delete the object itself.

현재 찾고있는 것은 아니지만 참고 : System.gc () 호출로 가비지 수집기를 호출 할 수 있습니다.


23
수동으로 호출 해야하는 것은 JVM에서 실제로 무시 될 수 있으므로 System.gc()일반적으로 좋은 생각이 아닙니다 .
cdeange

3
좋은 생각은 아니지만 System .. Runtime.getRuntime (). gc ()와 유사하게 호출 할 수도 있습니다. 추가 정보 : Java가 제공하는 가비지 콜렉션 루틴은 Runtime 클래스의 멤버입니다. Runtime 클래스는 각 주 프로그램에 대해 단일 개체 (Singleton)가있는 특수 클래스입니다. Runtime 개체는 가상 머신과 직접 통신하기위한 메커니즘을 제공합니다. Runtime 인스턴스를 가져 오려면 Singleton을 반환하는 Runtime.getRuntime () 메서드를 사용할 수 있습니다.
Timo 2013

1
null할당이 객체가 Garbaged 다음 GC 호출에 청소해야한다는 GC에 대한 명확한 기호? * 할당 null청소 (목록, 배열) 마크 그들 콜렉션 객체에? stackoverflow.com/questions/449409/…
George Daramouskas

그래서 내 모든 textviews와 imagebuttons를 null로 만들어야 onPause합니까?
Ruchir Baronia

가비지 수집기가 실행되거나 실행되는 경우 특정 개체를 수집 ( '삭제'하지 않음)한다는 보장은 없습니다.
Marquis of Lorne

64

C ++이 표시됩니다.

deleteJava 에는 없으며 모든 객체는 힙에 생성됩니다. JVM에는 참조 횟수에 의존하는 가비지 수집기가 있습니다.

개체에 대한 참조가 더 이상 없으면 가비지 수집기에서 수집 할 수있게됩니다.

myObject = null하지 않을 수도 있습니다. 예를 들면 :

Foo myObject = new Foo(); // 1 reference
Foo myOtherObject = myObject; // 2 references
myObject = null; // 1 reference

이 모든 작업은 참조 myObject를 null 로 설정 myObject하기 만하면 참조 횟수를 1만큼 감소시키는 것 외에는 한 번 가리키는 개체에 영향을주지 않습니다 . myOtherObject여전히 해당 개체를 참조 하므로 아직 수집 할 수 없습니다.


그래서 내 모든 textviews와 imagebuttons를 null로 만들어야 onPause합니까?
Ruchir Baronia

8
"JVM에는 참조 횟수에 의존하는 가비지 수집기가 있습니다." -> 매우 간단한 설명입니다. 이 객체가 특정 "루트"에서 연결할 수 있는지 확인
요하네스

2
JVM에는 참조 횟수에 특별히 의존 하지 않는 가비지 수집기가 있습니다. 도달 가능성에 의존합니다. 참조 횟수에 의존하는 경우주기를 수집 할 수 없으며 수집합니다.
Marquis of Lorne

14

개체가 사라지는 데 도움이 필요하면 참조를 null로 설정하십시오.

String x = "sadfasdfasd";
// do stuff
x = null;

참조를 null로 설정하면 개체에 대한 다른 참조가없는 한 개체가 가비지 수집 될 가능성이 높아집니다.


그렇게 할 때마다 내 개체가 교차 할 때 전체 게임이 정지되고 개체가 삭제되지 않습니다.
Stan

잡히지 않은 널 포인터 예외를 던지고 있기 때문입니다. 더 많은 컨텍스트는 확실히이 과정을 안내하는 데 도움이 될 것입니다.
Joseph Weissman

그래서 내 모든 textviews와 imagebuttons를 null로 만들어야 onPause합니까?
Ruchir Baronia

정말로 그들을 떠나야한다면 결국 그렇게 될 것입니다.
John Percival Hackworth 2016 년

3

Java에서 객체를 삭제할 필요가 없습니다. 개체에 대한 참조가 없으면 가비지 수집기에 의해 자동으로 수집됩니다.


그래서 내 모든 textviews와 imagebuttons를 null로 만들어야 onPause합니까?
Ruchir Baronia

0

를 사용하여 참조를 제거 할 수 있습니다 null.

수업이 있다고 가정 해 보겠습니다 A.

A a = new A();
a=null;

마지막 문은 개체의 참조를 제거 a하고 해당 개체는 JVM에 의해 "가비지 수집"됩니다. 이를 수행하는 가장 쉬운 방법 중 하나입니다.


그래서 내 모든 textviews와 imagebuttons를 null로 만들어야 onPause합니까?
Ruchir Baronia


-6
//Just use a List
//create the list
public final List<Object> myObjects;

//instantiate the list
myObjects = new ArrayList<Object>();

//add objects to the list
Object object = myObject;
myObjects.add(object);

//remove the object calling this method if you have more than 1 objects still works with 1
//object too.

private void removeObject(){
int len = myObjects.size();
for(int i = 0;i<len; i++){
Objects object = myObjects.get(i);
myObjects.remove(object);
}
}

이 대답이 잘못된 이유는 실제 개체 자체가 아닌 개체에 대한 참조 만 제거하기 때문입니다.
벤 모리스

목록에서 개체를 제거하는 방법을 보여주기 때문에이 답변이 잘못된 이유는 질문이 아닙니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.