Java'da bir nesneyi silmek mi?


101

Oluşturduğum bir nesneyi (sizi takip eden bir oval) silmek istiyorum, ancak bunu nasıl yaparım?

delete follower1;

işe yaramadı.

DÜZENLE:

Tamam, biraz daha bağlam vereceğim. Kontrol edebileceğiniz bir oval ve sizi takip eden bir oval ile küçük bir oyun yapıyorum. Şimdi şu adında dosyalarım var: DrawPanel.class, bu sınıf ekrandaki her şeyi çizer ve çarpışmaları, sesleri vb. İşler. Bir düşman sınıfım var, bu da oyuncuyu takip eden ovaldir. Kontrol edebileceğiniz oyuncu olan bir entity.class var. Oyuncu, takipçi ile kesişirse, oyuncu nesnemin silinmesini istiyorum. Bunu yapma şeklim:

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

1
biraz daha bağlam sağlayabilir misin?
Joseph Weissman

2
Java'da nesnelerin silinmesi yoktur. Ama normalde yapmanız gerekmez: ihtiyacınız olan şey artık ekranda hiçbir şeyin gösterilmediğinden emin olmaktır (eğer "sizi takip eden" buysa).
Paŭlo Ebermann

Belki de çöp toplayıcıyı bir nesneyi kaldırmaya zorlamak istersiniz? zaten burada bununla ilgili bir soru var . Ya da belki başka bir şey deniyorsun? Burada veya burada çöp toplayıcı hakkında biraz okumayı deneyebilirsiniz.Eğer hala bir yardımı yoksa, daha spesifik olmanız gerekir.
Fawix


Nesne ayırmalarını gerçekten elle yapmak istiyorsanız, JNI kullanın: Java kodundan kullanılan ancak her şeyi (oluşturma, silme, vb.) Kendi başına yapan bir C / C ++ kitaplığı oluşturun - ancak kitaplığınızın içinde C / C ++ kodu, Java yok. Bir Java nesnesini manuel olarak silmenin herhangi bir yolunu görmedim. Profilciniz size sorunlar olduğunu söylerse, bu sorunlar genellikle nesnelere "unutulmuş" referanslara dayanır. Senin durumunda hiçbir yerde bir sorun yok gibi görünüyor.
Johannes

Yanıtlar:


178

Boş atayarak veya bildirildiği bloğu bırakarak referansları kaldırmalısınız. Bundan sonra, çöp toplayıcı tarafından otomatik olarak silinecektir (hemen değil, en sonunda).

Örnek 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

Örnek 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.

Şu anda aradığınız bir şey değil, bilginize: System.gc () çağrısıyla çöp toplayıcıyı çağırabilirsiniz.


24
Manuel arama yapmak zorunda System.gc()kalmak genellikle iyi bir fikir değildir , çünkü aslında JVM tarafından görmezden gelinebilir.
cdeange

3
İyi bir fikir değil, ancak System .. Runtime.getRuntime (). Gc () 'ye benzer bir çağrı da yapabilirsiniz. Daha Fazla Bilgi: Java'nın sağladığı çöp toplama yordamları, Runtime sınıfının üyeleridir. Runtime sınıfı, her ana program için tek bir nesneye (bir Singleton) sahip özel bir sınıftır. Runtime nesnesi, doğrudan sanal makine ile iletişim kurmak için bir mekanizma sağlar. Runtime örneğini almak için, Singleton döndüren Runtime.getRuntime () yöntemini kullanabilirsiniz.
Timo

1
nullödev, bu nesne garbaged sonraki GC çağırma Temizlenmiş gerektiğini GC için kesin bir işaret var mı? * Atama nulltemizliği için (Listeler, Diziler) işaretleri, bunları toplama nesnelere? stackoverflow.com/questions/449409/…
George Daramouskas

Öyleyse, tüm metin görünümlerimi ve görüntü düğmelerimi onPause?
Ruchir Baronia

Çöp toplayıcının çalışacağına veya çalışıyorsa, belirli bir nesneyi toplayacağına ('silemeyeceğine') dair hiçbir garanti yoktur.
Marki Lorne

65

C ++ 'nız görünüyor.

Yok delete ve tüm nesneler yığın üzerinde oluşturulur. JVM, referans sayılarına dayanan bir çöp toplayıcısına sahiptir.

Bir nesneye daha fazla başvuru kalmadığında, çöp toplayıcı tarafından toplanmaya uygun hale gelir.

myObject = nullyapamayabilir; Örneğin:

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

Tüm bunlar referansı myObjectnull olarak ayarlamaktır, referans myObjectsayısını sadece 1 azaltmak dışında, işaret edildiği zaman nesneyi etkilemez. myOtherObjectHala o nesneye atıfta bulunduğundan, henüz toplanmaya müsait değildir.


Öyleyse, tüm metin görünümlerimi ve görüntü düğmelerimi onPause?
Ruchir Baronia

8
"JVM, referans sayılarına dayanan bir çöp toplayıcısına sahiptir." -> bu çok basitleştirilmiş bir açıklamadır. Nesnelerin belirli bir "kökten" erişilebilir olup olmadığını kontrol eder
Johannes

2
JVM spesifik olmayan bir çöp toplayıcı sahip olmayan referans sayıları kullanır. Erişilebilirliğe dayanır. Referans sayılarına dayandıysa, döngüleri asla toplayamaz ve toplar.
Lorne Markisi

14

Bir nesnenin uzaklaşmasına yardım etmek istiyorsanız, referansını null olarak ayarlayın.

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

Null değerine başvurunun ayarlanması, nesneye başka başvurular olmadığı sürece nesnenin çöp toplama olasılığını artırır.


Bunu ne zaman yapsam, nesnem kesiştiğinde, tüm oyunum donacak ve nesneyi silmeyecek.
Stan

Çünkü muhtemelen yakalanmamış bir boş işaretçi istisnası atıyorsunuz. Daha fazla içerik kesinlikle size bu konuda rehberlik etmemize yardımcı olacaktır.
Joseph Weissman

Öyleyse, tüm metin görünümlerimi ve görüntü düğmelerimi onPause?
Ruchir Baronia

Eğer gerçekten gitmelerine ihtiyacın varsa, o zaman sonunda bunu yapacaktı.
John Percival Hackworth

3

Java'da nesneleri silmenize gerek yoktur. Bir nesneye referans olmadığında, çöp toplayıcı tarafından otomatik olarak toplanacaktır.


Öyleyse, tüm metin görünümlerimi ve görüntü düğmelerimi onPause?
Ruchir Baronia

0

Referansı kullanarak kaldırabilirsiniz null.

Diyelim ki sınıfınız var A:

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

son ifade, nesnenin referansını kaldıracak ave bu nesne JVM tarafından "toplanan çöp" olacaktır. Bunu yapmanın en kolay yollarından biridir.


Öyleyse, tüm metin görünümlerimi ve görüntü düğmelerimi 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);
}
}

Bu cevabın yanlış olmasının nedeni, gerçek nesnenin kendisine değil, yalnızca Nesneye yapılan bir referansı kaldırmasıdır.
Ben Morris

Bu cevabın yanlış olmasının nedeni, bir nesneyi listeden nasıl kaldırabileceğinizi göstermesidir - soru bu değildi.
phil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.