Удаление объекта в 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 не нужно. Когда нет ссылки на объект, он будет автоматически собран сборщиком мусора.

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

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

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

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

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

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

Да, java - это сборщик мусора, он удалит память за вас.

Джейк Калстад
источник
37
в самый
неожиданный
2
s / delete / leak / g
Марк К. Коуэн
-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);
}
}
user3124852
источник
Причина, по которой этот ответ неверен, заключается в том, что он удаляет только ссылку на объект, а не сам фактический объект.
Бен Моррис
Причина, по которой этот ответ неверен, потому что он показывает, как вы можете удалить объект из списка - вопрос не в этом.
Фил