2014-01-20 74 views
0

如何從類中刪除java對象。比方說,我有一個類,如:從類中刪除java對象

class A 
{ 
    int hp; 
    public void update() 
    { 
     if(hp <= 0) 
     { 
      //here comes the problem. Something like: this.delete(); ?? 
     } 
    } 
} 

,我在檢查它是否應該刪除本身我的主要方法有一個實例。

編輯:在我的案例中'A'是2D RTS中的風車類。它坐落在風車的ArrayList,有以下方法:

init(called when the game starts to load images) 

update(this is where i want to delete the object) 

draw(for rendering) 
+0

請定義「刪除」?請提供一些背景,*任何*背景。 –

+0

......就像釋放內存一樣? – user2466076

+0

你想'刪除'做的JVM不適合你? –

回答

1

你試圖爲對象的「釋放內存」,而且遺憾的是沒有一個放之四海而皆準的解決辦法。您必須清空對該對象的所有活動引用。再次,這一切都取決於上下文,哪些變量引用了您感興趣的對象。做到這一點,當GC決定GC'ing需要完成時,GC將釋放參考,這是我們無法控制的,但只能向GC提出建議。


您在留言註明:

可以說A是sodier,如果它被殺死了我的魔杖刪除他

然後從軍人的職責列表中刪除他,可能一個數據庫或ArrayList。


最好聲明變量作爲限制的範圍成爲可能,讓他們自然地從所有引用釋放時不再需要,並剖析你的代碼,這樣就可以當它運行到麻煩看看。


幽州的評論:

是對象在一個ArrayList這樣問題就解決了這幸運的是公共和靜態的。 thans爲您的廣泛解釋

不,這是不正確的。 ArrayList不應該是靜態的也不是公有的,而應該是一個私有實例字段。使字段靜態意味着它不能以面向對象的方式使用。將其公開化意味着任何對象都可以隨時進行變異,而在複雜的程序中,這會導致難以追蹤問題並增加圈複雜度。它只能通過持有它的類的公共方法以可控的方式進行修改。我很抱歉,但是你的程序設計聽起來有缺陷,表明你會想要檢查,重構,改進它。如何,很難說基於信息片段。

+0

我沒想過,謝謝! – user2466076

+0

請術語。 *空*所有引用...和GC將釋放*對象。* – EJP

+1

@ user2466076即使可以訪問,強引用也會使對象保持活動狀態,因爲它仍然可能是需要的。 –

1

在Java中,您不能從內存中顯式刪除對象。好的是,這是由我們稱之爲「垃圾收集器」處理的。當它運行時,它會繞過查找沒有對它們的引用並刪除它們的對象。因此,你可以做的唯一事情就是刪除對象的所有引用(讓它們超出範圍,將它們設置爲null,然後等待GC運行)。

有沒有辦法迫使GC運行,但是,您可以技術上「鼓勵」它與System.gc()方法運行。這並不保證它會運行,除了邊緣情況以外不需要它。

0

即使C++你必須清理你的指針/對象的引用,才能安全地釋放它的內存。在Java中,這是你所要做的,剩下的就是這些。

更新(這就是我想要刪除的對象)

這意味着你想從你的ArrayList中刪除。您可以

  • 馬上行動吧,但這需要到列表(S)的對象是在參考。
  • 或發現例如去除死皮項當遍歷列表時。