Javaでオブジェクトを削除しますか?


99

作成したオブジェクト(あなたに続く楕円形)を削除したいのですが、どうすればいいですか?

delete follower1;

うまくいきませんでした。

編集:

さて、もう少しコンテキストを説明します。私はあなたがコントロールできる楕円とあなたに続く楕円で小さなゲームを作っています。これで、DrawPanel.classという名前のファイルを取得しました。このクラスは、画面上にすべてを描画し、衝突やサウンドなどを処理します。enemy.classを取得しました。これは、プレーヤーに続く楕円形です。私はあなたが制御できるプレイヤーであるentity.classを得ました。そして、プレーヤーがフォロワーと交差する場合は、プレーヤーオブジェクトを削除してもらいます。私がそれをやっている方法:

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

1
もう少しコンテキストを提供できますか?
ジョセフ

2
Javaではオブジェクトの削除はありません。しかし、通常は必要はありません。必要なのは、画面に何も表示されていないことを確認することです(これが「フォロー」している場合)。
パウロEbermann

おそらく、ガベージコレクターにオブジェクトを強制的に削除させたいですか?すでにここでそれについての質問があります。それとも何か他のものを試してみますか?ここまたはここで、ガベージコレクターについて少し読んでみてください。それでも解決しない場合は、より具体的にする必要があります。
Fawix


本当に手動でオブジェクト割り当てを処理したい場合は、JNIを使​​用します。Javaコードから使用されるC / C ++ライブラリを作成しますが、それ自体ですべて(作成、削除など)を実行しますが、ライブラリ内にはC / C ++コード、Javaなし。Javaオブジェクトを手動で削除する方法は見たことがありません。プロファイラーから問題があることが通知された場合、これらの問題は、多くの場合、オブジェクトへの「忘れられた」参照に基づいています。あなたの場合、どこにも問題がないようです。
ヨハネス

回答:


171

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
実際にはJVMによって無視される可能性があるため手動で呼び出す必要System.gc()は通常ありません
cdeange 2013年

3
良い考えではありませんが、System .. Runtime.getRuntime()。gc()のように呼び出すこともできます。詳細情報:Javaが提供するガベージコレクションルーチンは、Runtimeクラスのメンバーです。ランタイムクラスは、メインプログラムごとに1つのオブジェクト(シングルトン)を持つ特別なクラスです。Runtimeオブジェクトは、仮想マシンと直接通信するためのメカニズムを提供します。Runtimeインスタンスを取得するには、シングルトンを返すRuntime.getRuntime()メソッドを使用できます。
Timo

1
あるnull割り当ては、このオブジェクトは、次のGCの呼び出しで洗浄化けすることがありますか?*割り当てることをGCへの明確な兆候nullコレクションオブジェクト(リスト、配列)の洗浄のためのマークそれらをしますか? stackoverflow.com/questions/449409/...
ジョージDaramouskas

だから私は私のすべてのtextviewsとimagebuttonsをnullにする必要がありonPauseますか?
Ruchir Baronia

ガベージコレクタが実行されること、または実行された場合に特定のオブジェクトを収集(「削除」ではない)する保証はありません。
ローン侯爵

64

C ++が表示されています。

deleteJavaにはありません。すべてのオブジェクトはヒープ上に作成されます。JVMには、参照カウントに依存するガベージコレクタがあります。

オブジェクトへの参照がなくなると、ガベージコレクタによるコレクションに使用できるようになります。

myObject = nullそれをしないかもしれません。例えば:

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

これにより、参照myObjectがnullに設定さmyObjectれます。参照カウントが1だけ減る以外は、いったんポイントされたオブジェクトには影響しません。myOtherObjectまだそのオブジェクトを参照しているため、まだ収集できません。


だから私は私のすべてのtextviewsとimagebuttonsをnullにする必要がありonPauseますか?
Ruchir Baronia

8
「JVMには、参照カウントに依存するガベージコレクターがあります。」->これは非常に簡単な説明です。オブジェクトが特定の「ルート」から到達可能かどうかをチェックします
Johannes

2
JVMには、特に参照カウントに依存しないガベージコレクタがあります。到達可能性に依存しています。参照カウントに依存している場合、循環を収集することはできません。
ローン侯爵

14

オブジェクトが消えるのを助けたい場合は、その参照をnullに設定します。

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

参照をnullに設定すると、オブジェクトへの参照が他にない限り、オブジェクトがガベージコレクションされる可能性が高くなります。


そのときはいつでも、オブジェクトが交差すると、ゲーム全体がフリーズし、オブジェクトが削除されません。
2011

おそらくキャッチされていないnullポインタ例外をスローしているからです。より多くのコンテキストは、確かにこれをガイドするのに役立ちます。
ジョセフ

だから私は私のすべてのtextviewsとimagebuttonsをnullにする必要がありonPauseますか?
Ruchir Baronia

あなたが本当に彼らを離れる必要があるなら、それは結局それをするでしょう。
John Percival Hackworth、2016年

3

Javaでオブジェクトを削除する必要はありません。オブジェクトへの参照がない場合は、ガベージコレクターによって自動的に収集されます。


だから私は私のすべてのtextviewsとimagebuttonsをnullにする必要がありonPauseますか?
Ruchir Baronia

0

を使用して参照を削除できnullます。

あなたがクラスを持っているとしましょうA

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

最後のステートメントはオブジェクトの参照を削除し、aそのオブジェクトはJVMによって「ガベージコレクション」されます。これは、最も簡単な方法の1つです。


だから私は私のすべてのtextviewsとimagebuttonsをnullにする必要があり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);
}
}

この回答が正しくない理由は、オブジェクトへの参照のみが削除され、実際のオブジェクト自体は削除されないためです。
Ben Morris

リストからオブジェクトを削除する方法を示しているため、この回答が正しくない理由-これは問題ではありませんでした。
フィル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.