2012-02-01 12 views
7

मैं जावा क्लास में एक छात्र हूं और आज जावा के बारे में कुछ सीखा है जो मेरे गियर्स को बदल देता है। जब मैंने शिक्षक से पूछा कि क्यों और क्यों, वह व्यवहार के बारे में निश्चित नहीं था। क्या कोई समझा सकता है कि निम्नलिखित उदाहरण क्यों काम करता है?जावा स्कोप: एक विधि के अंदर तुरंत ऑब्जेक्ट लौटा रहा है - क्या यह खतरनाक है?

class Example { 
    public int ex_val; 

    public Example (int a) { 
     this.ex_val = a; 
    } 

    public int getExVal() { 
     return this.ex_val; 
    } 
} 

अगर मैं किसी अन्य वर्ग और "वापसी" वस्तु की एक विधि के अंदर "उदाहरण" का एक उदाहरण बनाने के लिए थे, इसे सफलतापूर्वक इसे से बाहर कूद मूल गुंजाइश है और बाद में इस्तेमाल किया जा कर सकते हैं।

class ParentObject { 
    // Instance Variables  
    public Example a; 

    public ParentObject (int number) { 
     // Initialize instance variable object from out-of-scope instantiation 
     this.a = genExample(number); 

     // Verify scope creep 
     System.out.println(this.a.getExVal()); 
    } 

    public Example genExample (int a) { 
     return new Example(a); 
    } 
} 

यह काम करता है, लेकिन क्या यह व्यवहार स्थिर है? क्या मैं इस पर भरोसा कर सकता हूं? क्या कचरा कलेक्टर कॉलिंग फ़ंक्शन के एक विधि और असाइनमेंट स्टेटमेंट के रिटर्न स्टेटमेंट के बीच कूद सकता है? क्या मैं अपने ओएस के जेवीएम के संस्करण के आधार पर विफलता का जोखिम चला रहा हूं? यह आसान कार्यक्षमता की तरह लगता है अगर इसे भरोसा किया जा सकता है।

+0

यह नहीं कह सकता कि मैं समझ रहा हूं कि आप यहां क्या पूछ रहे हैं। "इसका मूल दायरा से बाहर निकलने" का क्या मतलब है? क्या आप एक सी ++ प्रोग्रामर हैं? –

+2

आप जीवनकाल के साथ गुंजाइश कर रहे हैं। चर के रूप में, वस्तुओं के लिए आजीवन के रूप में गुंजाइश के बारे में सोचो। –

उत्तर

9

यह जावा में करने के लिए एक पूरी तरह से सामान्य, सामान्य और विश्वसनीय चीज है, और यह करने की बात यह है कि कचरा कलेक्टर ऑब्जेक्ट को तब तक साफ कर देगा जब तक इसका कोई लाइव संदर्भ न हो। यह ओएस-निर्भर या जेवीएम-निर्भर नहीं है: इसके साथ कोई भी जेवीएम ठीक होगा।

3

यह बिल्कुल सामान्य है।

कचरा कलेक्टर इसे एकत्र नहीं कर सकता क्योंकि यह अभी भी आपके a फ़ील्ड द्वारा संदर्भित है।

सी ++ के विपरीत, जावा ऑब्जेक्ट्स उनको बनाए गए दायरे से कभी जुड़े नहीं होते हैं।

+0

, "सी ++ के विपरीत, जावा ऑब्जेक्ट्स उनको बनाए गए दायरे से कभी जुड़े नहीं होते हैं।" -> यह गलत है। यदि किसी ऑब्जेक्ट को फ़ंक्शन बॉडी के भीतर बनाया गया है और इसका संदर्भ रिटर्न तर्क के रूप में या किसी अन्य माध्यम से "लीक आउट" नहीं है, तो इसका जीवनकाल उस क्षेत्र से जुड़ा हुआ है जिसमें इसे बनाया गया था यानी ऑब्जेक्ट दायरे से बाहर है, यह कचरा संग्रह के लिए योग्य है। आपको उस अंतिम पंक्ति को फिर से भरना पड़ सकता है। – eternaln00b

+0

@ सिद्धार्थशंकर: हालांकि यह सच है, वस्तु स्पष्ट रूप से दायरे में _linked_ नहीं है। इसके बजाय, यह वही जीवन भर होता है। – SLaks

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