Видалення об’єкта в Java?


99

Я хочу видалити створений мною об’єкт (овал, який слід за вами), але як би це зробити?

delete follower1;

не працював.

Редагувати:

Гаразд, ще трохи контексту. Я роблю маленьку гру з овалом, яким ви можете керувати, і овалом, який слід за вами. Тепер у мене є файли з назвою: DrawPanel.class, цей клас малює все на екрані та обробляє зіткнення, звуки тощо. У мене є neprijaтель.клас, який є овалом після програвача. Я отримав entity.class, який є гравцем, яким ви можете керувати. І якщо гравець перетинається з послідовником, я хочу, щоб мій об’єкт гравця був видалений. Те, як я це роблю:

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

1
чи можете ви надати трохи більше контексту?
Джозеф Вайсман

2
У Java немає видалення об'єктів. Але вам зазвичай не потрібно: потрібно лише переконатися, що на екрані більше нічого не відображається (якщо це робить "слідування за вами").
Paŭlo Ebermann

Можливо, ви хочете спробувати змусити збирач сміття видалити об’єкт? є питання про це тут вже. А може, ви намагаєтесь щось інше? ви можете спробувати прочитати трохи про збирач сміття тут або тут. Якщо це все одно не допомагає, вам потрібно буде бути більш конкретним.
Fawix


Якщо ви дійсно дійсно хочете обробляти розподіл об’єктів вручну, використовуйте JNI: створіть бібліотеку C / C ++, яка використовується з коду Java, але робить все (створює, видаляє тощо) самостійно - але всередині вашої бібліотеки у вас є C / Код С ++, без Java. Я не бачив жодного способу видалити об’єкт Java вручну. Якщо ваш профайлер повідомляє, що є проблеми, ці проблеми часто базуються на "забутих" посиланнях на об'єкти. У вашому випадку, здається, ніде не виникає проблем.
Йоганнес

Відповіді:


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.

Не те, що ви зараз шукаєте, але FYI: ви можете викликати збирач сміття за допомогою виклику System.gc ()


23
Доводиться вручну дзвонити, System.gc()як правило, не є гарною ідеєю , оскільки JVM може насправді ігнорувати.
cdeange

3
Не гарна ідея, але ви також можете зателефонувати схожий на System .. Runtime.getRuntime (). Gc (). Більше інформації: процедури збору сміття, які надає Java, є членами класу Runtime. Клас виконання - це спеціальний клас, який має по одному об'єкту (Singleton) для кожної основної програми. Об'єкт Runtime забезпечує механізм зв'язку безпосередньо з віртуальною машиною. Щоб отримати екземпляр Runtime, ви можете використовувати метод Runtime.getRuntime (), який повертає Singleton.
Тимо

1
Чи nullприсвоєння GC є певним знаком того, що цей об'єкт повинен бути очищений за допомогою Garbaged Cleaned під час наступного виклику GC? * Призначення nullоб’єктів колекції (списки, масиви) позначає їх для очищення? stackoverflow.com/questions/449409 / ...
George Daramouskas

Тож я повинен зробити всі свої текстові перегляди та кнопки кнопок нульовими у onPause?
Ручір Баронія

Немає жодних гарантій того, що збирач сміття коли-небудь запуститься, або якщо він це зробить, він буде збирати (а не `` видаляти '') будь-який конкретний об'єкт.
Маркіз Лорн

64

Показується ваш C ++.

У deleteJava немає , і всі об'єкти створюються на купі. У JVM є сміттєзбірник, який покладається на довідковий облік.

Коли більше немає посилань на об’єкт, він стає доступним для збору збирачем сміття.

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

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

Все це робить установку посилання myObjectна нуль, це не впливає на об'єкт, на який myObjectодин раз вказано, за винятком простого зменшення кількості посилань на 1. Оскільки myOtherObjectвсе ще посилається на цей об'єкт, він ще не доступний для збору.


Тож я повинен зробити всі свої текстові перегляди та кнопки кнопок нульовими у onPause?
Ручір Баронія

8
"У JVM є сміттєзбірник, який покладається на довідковий облік". -> це дуже спрощене пояснення. Він перевіряє, чи доступні об'єкти із певного «кореня»
Йоганнеса

2
JVM має сміттєзбірник, який конкретно не покладається на довідковий облік. Це покладається на доступність. Якщо він спирався на опорні підрахунки, він ніколи не може збирати цикли, і це робить.
Маркіз Лорн

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.