Удаление объекта в Java?


99

Я хочу удалить созданный мной объект (овал, который следует за вами), но как мне это сделать?

delete follower1;

не сработало.

РЕДАКТИРОВАТЬ:

Хорошо, я дам еще немного контекста. Я делаю небольшую игру с овалом, которым вы можете управлять, и овалом, который следует за вами. Теперь у меня есть файлы с именами: DrawPanel.class, этот класс рисует все на экране и обрабатывает столкновения, звуки и т. Д. У меня есть own.class, который представляет собой овал, следующий за игроком. У меня есть entity.class, которым вы можете управлять. И если игрок пересекается с последователем, я хочу, чтобы мой объект игрока был удален. Как я это делаю:

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

1
не могли бы вы дать немного больше контекста?
— Джозеф Вайсман

2
В Java нет удаления объектов. Но обычно в этом нет необходимости: вам нужно убедиться, что на экране больше ничего не отображается (если это то, что делает «слежение за вами»).
— Паоло Эберманн

Возможно, вы хотите попробовать заставить сборщик мусора удалить объект? есть вопрос об этом здесь уже. Или, может быть, вы пробуете что-то еще? вы можете попробовать прочитать немного о сборщике мусора здесь или здесь. Если это все еще не поможет, вам нужно будет уточнить детали.
— Fawix

возможный дубликат
— принудительного

Если вы действительно действительно хотите обрабатывать выделение объектов вручную, используйте JNI: создайте библиотеку C / C ++, которая используется из кода Java, но делает все (создает, удаляет и т. Д.) Самостоятельно, но внутри вашей библиотеки у вас есть C / Код на C ++, без Java. Я не видел способа удалить объект Java вручную. Если ваш профилировщик сообщает вам о наличии проблем, эти проблемы часто возникают из-за «забытых» ссылок на объекты. В вашем случае, похоже, нигде нет проблем.
— Johannes

Ответы:


172

Вы должны удалить ссылки на него, присвоив 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
Вызов вручную, System.gc()как правило, не является хорошей идеей , поскольку на самом деле он может игнорироваться JVM.
— cdeange

3
Не очень хорошая идея, но вы также можете вызвать его аналогично System .. Runtime.getRuntime (). Gc (). Дополнительная информация: процедуры сборки мусора, предоставляемые Java, являются членами класса Runtime. Класс Runtime - это специальный класс, который имеет один объект (Singleton) для каждой основной программы. Объект Runtime предоставляет механизм для прямой связи с виртуальной машиной. Чтобы получить экземпляр Runtime, вы можете использовать метод Runtime.getRuntime (), который возвращает Singleton.
— Тимо

1
Является ли nullприсвоение GC определенным признаком того, что этот объект должен быть очищен от мусора при следующем вызове GC? * Присвоение nullобъектам коллекции (спискам, массивам) помечает их для очистки? stackoverflow.com/questions/449409/…
— Георгий Дарамовскас

Поэтому я должен сделать все мои текстовые представления и кнопки изображений нулевыми в параметре onPause?
— Ruchir Baronia

Нет никакой гарантии, что сборщик мусора когда-либо запустится или что, если это произойдет, он соберет (а не «удалит») какой-либо конкретный объект.
— Marquis of Lorne

64

Ваш C ++ показывает.

Здесь нет delete java нет, и все объекты создаются в куче. В JVM есть сборщик мусора, который полагается на счетчики ссылок.

Как только на объект больше нет ссылок, он становится доступным для сбора сборщиком мусора.

myObject = nullне может этого делать; например:

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

Все это устанавливает ссылку myObjectна null, это не влияет на объект, на который myObjectкогда-то указали, за исключением простого уменьшения счетчика ссылок на 1. Поскольку myOtherObjectвсе еще ссылается на этот объект, он еще не доступен для сбора.


Поэтому я должен сделать все мои текстовые представления и кнопки изображений нулевыми в параметре onPause?
— Ruchir Baronia

8
«В JVM есть сборщик мусора, который полагается на счетчик ссылок». -> это очень упрощенное объяснение. Он проверяет, достижимы ли объекты из определенного «корня»
— Йоханнес

2
В JVM есть сборщик мусора, который специально не полагается на счетчик ссылок. Он полагается на достижимость. Если бы он полагался на счетчик ссылок, он никогда бы не смог собрать циклы, и он это делает.
— Marquis of Lorne

14

Если вы хотите, чтобы объект исчез, установите для его ссылки значение null.

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

Установка ссылки на null повысит вероятность того, что объект будет обработан сборщиком мусора, пока нет других ссылок на объект.


Когда бы я ни делал это, когда мой объект пересекался, вся моя игра зависала, и она не удаляла объект.
— Стэн

Потому что вы, вероятно, генерируете исключение неперехваченного нулевого указателя. Более подробный контекст, безусловно, поможет нам в этом.
— Джозеф Вайсман,

Поэтому я должен сделать все мои текстовые представления и кнопки изображений нулевыми в параметре onPause?
— Ruchir Baronia

Если вам действительно нужно, чтобы они ушли, то со временем это сделает.
— Джон Персиваль Хакворт

3

Удалять объекты в java не нужно. Когда нет ссылки на объект, он будет автоматически собран сборщиком мусора.


Поэтому я должен сделать все мои текстовые представления и кнопки изображений нулевыми в параметре onPause?
— Ruchir Baronia

0

Вы можете удалить ссылку, используя null .

Допустим, у вас есть класс A:

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

Последний оператор удалит ссылку на объект, aи этот объект будет "собран мусором" JVM. Это один из самых простых способов сделать это.


Поэтому я должен сделать все мои текстовые представления и кнопки изображений нулевыми в параметре 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);
}
}

Причина, по которой этот ответ неверен, заключается в том, что он удаляет только ссылку на объект, а не сам фактический объект.
— Бен Моррис

Причина, по которой этот ответ неверен, потому что он показывает, как вы можете удалить объект из списка - вопрос не в этом.
— Фил
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.