जावा में एक वस्तु को हटाना?


99

मैं अपने द्वारा बनाई गई एक वस्तु को हटाना चाहता हूं, (एक अंडाकार जो आपके पीछे आता है), लेकिन मैं यह कैसे करूंगा?

delete follower1;

काम नहीं किया।

संपादित करें:

ठीक है, मैं कुछ और संदर्भ दूंगा। मैं एक अंडाकार के साथ एक छोटा खेल बना रहा हूं जिसे आप नियंत्रित कर सकते हैं, और एक अंडाकार जो आपके पीछे आता है। अब मुझे फाइलें मिल गई हैं: DrawPanel.class, यह वर्ग स्क्रीन पर सब कुछ खींचता है, और टकराव, आवाज़ आदि को संभालता है। मुझे एक शत्रु मिल गया है। क्लब, जो खिलाड़ी के बाद अंडाकार है। मुझे एक इकाई मिली। क्लब, जो कि वह खिलाड़ी है जिसे आप नियंत्रित कर सकते हैं। और अगर खिलाड़ी अनुयायी के साथ जुड़ता है, तो मैं चाहता हूं कि मेरे खिलाड़ी को हटा दिया जाए। जिस तरह से मैं यह कर रहा हूँ:

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

1
क्या आप थोड़ा और संदर्भ प्रदान कर सकते हैं?
जोसफ वीसमैन

2
जावा में वस्तुओं का कोई विलोपन नहीं है। लेकिन आपको आम तौर पर यह करने की आवश्यकता नहीं है: आपको जो कुछ भी सुनिश्चित करने की आवश्यकता है वह स्क्रीन पर कुछ भी नहीं दिखाया गया है (यदि यह "आप का अनुसरण कर रहा है")।
पाओलो एबरमन

शायद आप किसी ऑब्जेक्ट को हटाने के लिए कचरा कलेक्टर को आज़माना चाहते हैं? इसके बारे में यहाँ पहले से ही एक प्रश्न है । या शायद आप कुछ और कोशिश कर रहे हैं? आप यहाँ या यहाँ कूड़ा उठाने वाले के बारे में थोड़ा पढ़ने की कोशिश कर सकते हैं यदि इसकी अभी भी कोई मदद नहीं मिली है, तो आपको और अधिक विशिष्ट होने की आवश्यकता होगी।
फवीक्स


यदि आप वास्तव में वास्तव में ऑब्जेक्ट एलोकेशन को मैन्युअल रूप से हैंडल करना चाहते हैं, तो JNI का उपयोग करें: C / C ++ लिबास बनाएं जो जावा कोड से उपयोग किया जाता है, लेकिन यह सब कुछ (क्रिएट, डिलीट इत्यादि) खुद करता है - लेकिन आपके लिब के अंदर आपके पास C / है। सी ++ कोड, कोई जावा। मैंने जावा ऑब्जेक्ट को मैन्युअल रूप से हटाने का कोई तरीका नहीं देखा है। यदि आपका प्रोफाइलर आपको बताता है कि समस्याएं हैं, तो ये समस्याएं अक्सर वस्तुओं के संदर्भ में "भूल" पर आधारित होती हैं। आपके मामले में कहीं भी कोई समस्या नहीं है।
जोहान्स

जवाबों:


172

आपको अशक्त बताकर या उस ब्लॉक को छोड़ना चाहिए जहां इसे घोषित किया गया था। उसके बाद, यह कचरा कलेक्टर द्वारा स्वचालित रूप से हटा दिया जाएगा (तुरंत नहीं, लेकिन अंततः)।

उदाहरण 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 करें: आप कचरा संग्रहकर्ता को Call System.gc () के साथ आमंत्रित कर सकते हैं


23
मैन्युअल रूप से कॉल System.gc()करना आमतौर पर एक अच्छा विचार नहीं है , क्योंकि यह वास्तव में जेवीएम द्वारा अनदेखा किया जा सकता है।
cdeange

3
एक अच्छा विचार नहीं है, लेकिन आप सिस्टम .. Runtime.getRuntime ()। Gc () के समान कॉल कर सकते हैं। अधिक जानकारी: वह कचरा संग्रह दिनचर्या है कि जावा प्रदान करता है रनटाइम वर्ग के सदस्य हैं। रनटाइम क्लास एक विशेष वर्ग है जिसमें प्रत्येक मुख्य कार्यक्रम के लिए एक एकल ऑब्जेक्ट (एक सिंगलटन) होता है। रनटाइम ऑब्जेक्ट वर्चुअल मशीन के साथ सीधे संवाद करने के लिए एक तंत्र प्रदान करता है। रनटाइम उदाहरण प्राप्त करने के लिए, आप Runtime.getRuntime () विधि का उपयोग कर सकते हैं, जो सिंग्लटन को लौटाता है।
तिमो

1
क्या nullअसाइनमेंट GC के लिए एक निश्चित संकेत है कि यह ऑब्जेक्ट अगले GC आमंत्रण में गारबेज क्लीन किया जाना है? * nullऑब्जेक्ट्स (Lists, Arrays) को संग्रह करने के लिए असाइन करना उन्हें सफाई के लिए चिह्नित करता है? stackoverflow.com/questions/449409/…
जॉर्ज डारमुस्कोस

तो मुझे अपने सभी साक्षात्कार और इमेजबुटन्स को अशक्त बनाना चाहिए onPause?
रुचिर बैरोनिया

इस बात की कोई गारंटी नहीं है कि कचरा कलेक्टर कभी भी चलेगा, या यह कि अगर यह होता है, तो यह किसी विशिष्ट वस्तु को एकत्र करेगा ('डिलीट नहीं')।
लोर्ने

64

आपका C ++ दिखा रहा है।

deleteजावा में कोई भी नहीं है, और सभी वस्तुओं को ढेर पर बनाया गया है। जेवीएम में एक कचरा कलेक्टर होता है जो संदर्भ गणना पर निर्भर करता है।

एक बार जब किसी वस्तु का अधिक संदर्भ नहीं होता है, तो यह कचरा संग्रहकर्ता द्वारा संग्रह के लिए उपलब्ध हो जाता है।

myObject = nullयह नहीं कर सकते हैं; उदाहरण के लिए:

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

यह सब करता है myObjectअशक्त करने के लिए संदर्भ सेट है , यह myObjectकेवल 1 द्वारा संदर्भ गणना में वृद्धि को छोड़कर एक बार इंगित की गई वस्तु को प्रभावित नहीं करता है। myOtherObjectअभी भी उस वस्तु को संदर्भित करता है, यह अभी तक एकत्र होने के लिए उपलब्ध नहीं है।


तो मुझे अपने सभी साक्षात्कार और इमेजबुटन्स को अशक्त बनाना चाहिए onPause?
रुचिर बैरोनिया

8
"जेवीएम में एक कचरा कलेक्टर है जो संदर्भ गणना पर निर्भर करता है।" -> यह एक बहुत ही सरल स्पष्टीकरण है। यह जाँचता है कि क्या वस्तुएं एक विशिष्ट "रूट" से उपलब्ध हैं
जोहान्स

2
जेवीएम में एक कचरा कलेक्टर है जो विशेष रूप से संदर्भ गणना पर भरोसा नहीं करता है । यह रीचैबिलिटी पर निर्भर करता है। यदि यह संदर्भ पर निर्भर करता है तो यह कभी भी चक्र एकत्र नहीं कर सकता है, और यह करता है।
लोर्ने

14

यदि आप किसी वस्तु को दूर जाने में मदद करना चाहते हैं, तो उसके संदर्भ को शून्य पर सेट करें।

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

अशक्त के संदर्भ को सेट करने से यह अधिक संभावना होगी कि ऑब्जेक्ट कचरा एकत्र किया जाएगा, जब तक कि ऑब्जेक्ट के लिए कोई अन्य संदर्भ न हो।


जब भी मैं ऐसा करता हूं, जब मेरी ऑब्जेक्ट इंटरसेक्ट होती है, तो मेरा पूरा गेम फ्रीज हो जाएगा, और यह ऑब्जेक्ट को डिलीट नहीं करेगा।
स्टेन

क्योंकि आप शायद एक अनकहा अशक्त पॉइंटर अपवाद फेंक रहे हैं। अधिक संदर्भ निश्चित रूप से इसके माध्यम से हमारा मार्गदर्शन करने में आपकी सहायता करेगा।
जोसेफ वीसमैन

तो मुझे अपने सभी साक्षात्कार और इमेजबुटन्स को अशक्त बनाना चाहिए onPause?
रुचिर बैरोनिया

यदि आपको वास्तव में उन्हें दूर जाने की आवश्यकता है, तो वह अंततः ऐसा करेगा।
जॉन पर्किवल हैकवर्थ

3

आपको जावा में वस्तुओं को हटाने की आवश्यकता नहीं है। जब किसी ऑब्जेक्ट का कोई संदर्भ नहीं होता है, तो यह कचरा कलेक्टर द्वारा स्वचालित रूप से एकत्र किया जाएगा।


तो मुझे अपने सभी साक्षात्कार और इमेजबुटन्स को अशक्त बनाना चाहिए onPause?
रुचिर बैरोनिया

0

आप संदर्भ का उपयोग करके निकाल सकते हैं null

मान लीजिए कि आपके पास कक्षा है A:

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

अंतिम विवरण वस्तु के संदर्भ को हटा देगा aऔर उस वस्तु को जेवीएम द्वारा "कचरा एकत्र" किया जाएगा। यह ऐसा करने के सबसे आसान तरीकों में से एक है।


तो मुझे अपने सभी साक्षात्कार और इमेजबुटन्स को अशक्त बनाना चाहिए onPause?
रुचिर बैरोनिया


-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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.