2016-07-16 5 views
6

अद्यतनआवंटित कक्षा में बनाए गए वर्ग या बस स्थान का नया उदाहरण आवंटित?

public Fish mate(Fish other){ 
    if (this.health > 0 && other.health > 0 && this.closeEnough(other)){ 

    int babySize = (((this.size + other.size) /2)); 
    int babyHealth = (((this.health + other.health) /2)); 
    double babyX = (((this.x + other.x) /2.0)); 
    double babyY = (((this.y + other.y) /2.0)); 

    new Fish (babySize, babyHealth, babyX, babyY); 
    } 
    return null; 
} 

जब new Fish कहा जाता है, वहाँ Fish एक संदर्भ बिना चल कहीं आस-पास का एक नया उदाहरण है या मैं सिर्फ वास्तव में यह instantiating बिना एक नई Fish के लिए स्मृति आवंटित किया गया है?

क्या मुझे new FishFish का वास्तविक उदाहरण बनाने के लिए एक लूप के माध्यम से पुनरावृत्ति के अलावा एक अद्वितीय संदर्भ नाम के साथ कॉल मिल सकता है?

+2

अंतिम भाग स्पष्ट नहीं है – Amit

+0

मुझे लगता है कि एक 'मछली' बनाया गया है, लेकिन चूंकि यह पहुंच योग्य नहीं है, यह कचरा संग्रह के लिए उपलब्ध है और किसी भी पल में अस्तित्व में रहेगा (जब JVM इसे नष्ट करने का फैसला करता है) । – Gendarme

+0

@ गेंडर्म मैं प्रत्येक बार दोस्त नामक अद्वितीय नाम कैसे प्राप्त करूं? –

उत्तर

8

जब नए Fish कहा जाता है, वहाँ मछली एक चर नाम के बिना कहीं आस-पास चल या मैं सिर्फ वास्तव में यह instantiating बिना एक नई Fish के लिए स्मृति आवंटित का एक नया उदाहरण है?

एक नया Fish ऑब्जेक्ट बनाया जाएगा, और कचरा इकट्ठा किया जाएगा क्योंकि इसका कोई संदर्भ नहीं है। कचरा संग्रह (कभी-कभी)Fish के कन्स्ट्रक्टर के बाद किया जाएगा।
आपके मामले में जो अधिक समझ में नहीं आता है, लेकिन कभी-कभी ऐसा होता है, यदि किसी ऑब्जेक्ट को तत्काल करने से नया Thread शुरू हो जाएगा या कुछ अन्य दिनचर्या चलाएं जिन्हें आप चला सकते हैं तो केवल

मैं केवल स्मृति आवंटित है या वहाँ किसी नाम के बिना Fish है, तो मैं कैसे नई Fish एक अनूठा चर नाम के साथ Fish का एक वास्तविक उदाहरण बनाने के लिए कॉल कर सकते हैं?

यह बहुत स्पष्ट नहीं है। लेकिन मैं समझ है कि आप बस return new Fish(...); करना चाहते हैं और एक चर खुद जहां, इसे कहते की तरह कुछ के लिए असाइन करें:

Fish babyFish = femaleFish.mate(maleFish); 
+0

आपका उत्तर बताता है कि कन्स्ट्रक्शन का काम कन्स्ट्रक्टर के काम के समाप्त होने के ठीक बाद होगा, जो हमेशा मामला नहीं है (और वास्तव में यह शायद ही कभी है)। – mewa

+0

@mewa मैंने इस बारे में थोड़ा सा स्पष्टीकरण जोड़ा।धन्यवाद – Idos

+0

मुझे नई मछली लौटने की परवाह नहीं है, मैं सिर्फ एक मातृभाषा को एक अद्वितीय नाम के साथ एक नई मछली बनाने के लिए चाहता हूं, जिसे हर बार दोस्त का उपयोग किया जाता है, चाहे वह मछली वस्तु कहलाता हो। क्या यह संभव है? –

4

"मैं सिर्फ स्मृति एक नई मछली के लिए वास्तव में यह instantiating बिना आवंटित "

नहीं। उदाहरण शुरू किया गया है (कन्स्ट्रक्टर निष्पादित किया गया है), लेकिन अगर इस उदाहरण के लिए कोई संदर्भ नहीं रखा जाता है तो यह अंततः कचरा एकत्रित होगा। ध्यान रखें कि यदि आपका कोड ऐसा नहीं करता है तो भी एक संदर्भ रखा जा सकता है, उदाहरण के लिए यदि कन्स्ट्रक्टर कुछ स्थिर चर में this डालता है।

+0

क्या नई मछली को एक अद्वितीय नाम देने के लिए वैसे भी है या क्या मैं केवल कुछ ऐसा कर सकता हूं: मछली बेबीफिश = नई मछली (बेबी साइज, बेबी हेल्थ, बेबीएक्स, बेबी वाई); –

+0

@ZacTaylor जैसा कि मैंने स्वयं प्रश्न पर टिप्पणी की थी, यह बिल्कुल स्पष्ट नहीं है। "अद्वितीय नाम" (या वास्तव में "नाम" वास्तव में) का क्या मतलब है? – Amit

+0

वेरिएबल का नाम जो मछली –

2

सबसे पहले, मुझे अपनी शब्दावली में कुछ भ्रम साफ़ करने दें: ऑब्जेक्ट का कोई नाम नहीं है। एक परिवर्तनीय का नाम है, लेकिन आपके पास एक ही ऑब्जेक्ट का जिक्र करने वाले विभिन्न नामों के कई चर हो सकते हैं। ऑब्जेक्ट वेरिएबल रेफरेंस ऑब्जेक्ट का मतलब यह नहीं है कि ऑब्जेक्ट का नाम है।

आप new Fish() है, लेकिन कुछ भी करने के लिए नए संदर्भ निर्दिष्ट नहीं करते हैं, नई वस्तु के रूप में जल्द निर्माता रिटर्न के रूप में पहुँच योग्य नहीं हो जाएगा।

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

3

निम्नलिखित आकृति के स्पष्टीकरण ने वास्तव में मेरी मदद की जब मुझे शुरुआत में भ्रम था और मुझे आशा है कि आप भी आपकी मदद करेंगे। आप यहां कर्मचारी के रूप में सोच सकते हैं।

enter image description here

अपने मामले में आप एक विधि के अंदर स्थानीय स्तर पर एक new Fish() वस्तु बनाई है, ताकि के जीवनकाल स्थानीय रूप से सौंपा जाना चाहिए के रूप में में अच्छी तरह से कचरा कलेक्टर हमेशा अप्रयुक्त वस्तुओं के लिए लग रहा है और के रूप में संग्रह के लिए इस उपयुक्त पहचान करेगा विधि के अंदर परिभाषित अन्य स्थानीय लोगों के साथ ही आपकी विधि निकलती है।

मैं नए मछली कॉल प्राप्त कर सकते हैं:

आप अशक्त लौट रहे हैं, तो इस विधि का कारखाना विधि संरचना के रूप में नहीं माना जा सकता क्योंकि यह एक instance.I वापस नहीं करता है सुनिश्चित करें कि आप क्या मतलब द्वारा नहीं कर रहा हूँ एक लूप के माध्यम से पुनरावृत्ति के अलावा एक अद्वितीय संदर्भ नाम के साथ मछली का वास्तविक उदाहरण बनाने के लिए?

लेकिन मुझे लगता है अगर आप सही new Fish() वह यह है कि अंदर method.The संक्षिप्त उत्तर है उपयोग कर सकते हैं आप से पूछा: कोई। यद्यपि आप निश्चित रूप से एक और new Fish() बना सकते हैं लेकिन आपको उस पते को पुनर्प्राप्त करने के लिए संदर्भ चर की आवश्यकता है या आप शून्य के बजाए विधि के लिए आवृत्ति वापस कर सकते हैं, जो एक स्थिर फैक्ट्री विधि होगी और जब आप अलग से नाम करना चाहते हैं तो एक अच्छा अभ्यास के रूप में जाना जाता है आपके रचनाकार

अपने अपडेट किए गए सवालों का जवाब देने के लिए दोनों एक अधिक विशिष्ट तरीके में:

1) आप एक नया वस्तु बनाया था, जब आप new Fish() लिखा था लेकिन तुम सच में पुनः प्राप्त करने के उस वस्तु information.It तरह के एक संदर्भ चर का निर्माण नहीं किया आपने एक घर बनाया है लेकिन आप घर के पते को नहीं जानते हैं। तब आप कभी घर नहीं जा सकते। क्या होगा, पुनर्प्राप्ति प्रक्रिया की कमी के कारण, इस वस्तु को कचरा कलेक्टर द्वारा अप्रयुक्त के रूप में पहचाना जाएगा और इसलिए इसे एकत्रित किया जाएगा।

2) चूंकि नई वस्तु में संग्रहीत जानकारी प्राप्त करने के लिए कोई संदर्भ/सूचक या कुछ भी नहीं है, इसलिए आप विधि के अंदर सटीक new Fish() पुनर्प्राप्त नहीं कर सकते हैं, लेकिन यदि आप वास्तव में करना चाहते हैं तो आप निश्चित रूप से संदर्भ चर के साथ एक और ऑब्जेक्ट बना सकते हैं ऑब्जेक्ट में संग्रहीत जानकारी पुनर्प्राप्त करें।

आखिरकार, हालांकि यह मुख्य रूप से सी भाषा के उपयोग के लिए लिखा गया है, स्टैनफोर्ड विश्वविद्यालय के निक पार्लांटे द्वारा निम्नलिखित दस्तावेज संदर्भ, ढेर और ढेर यादों को समझाने में असाधारण नौकरी करता है। Click here.

संबंधित मुद्दे