... यह है, और इसलिए अपने नए दूर जब उड़ा रहा है मैं विधि से बाहर निकलो?
नहीं। यह जावा के अर्थशास्त्र उत्तीर्ण तर्क के कारण है।
जावा तर्क "मूल्य से" पारित किए जाते हैं, लेकिन किसी ऑब्जेक्ट या सरणी प्रकार के मामले में, आपके द्वारा गुजरने वाला मान ऑब्जेक्ट/सरणी संदर्भ है। जब आप mySet
पर एक नया सेट ऑब्जेक्ट बनाते और असाइन करते हैं, तो आप बस स्थानीय चर/पैरामीटर सेट कर रहे हैं। चूंकि जावा मूल्य से गुजरता है, इसका foo
वैरिएबल पर main
विधि में कोई प्रभाव नहीं पड़ता है।
जब आप test
विधि दर्ज करते हैं, तो आपके पास HashSet
उदाहरण के संदर्भ में main
विधि में निर्मित दो प्रतियां हैं; foo
में से एक और mySet
में से एक। आपका कोड तब नव निर्मित HashSet
के संदर्भ के साथ mySet
में संदर्भ को प्रतिस्थापित करता है, लेकिन यह नया संदर्भ कॉलर को वापस नहीं भेजा जाता है। (आप वापस test
विधि के परिणाम के रूप में इसे पारित करने के ... उदाहरण के लिए अपने कोड को बदल सकता है लेकिन आप इस स्पष्ट रूप से क्या करना है।।)
ठीक है - लेकिन - अगर मैं ऐसा करने के लिए थे मेरे विधि कॉल के भीतर जोड़ें या कुछ अन्य ऑपरेशन, आवंटन संरक्षित किया जाएगा। ऐसा क्यों है?
है ऐसा इसलिए है क्योंकि जब आप foo
या mySet
में संदर्भ का उपयोग कर एक उदाहरण विधि कॉल, उस विधि वस्तु (HashSet
) कि संदर्भ को संदर्भित करता है पर निष्पादित किया जाता है। यह मानते हुए कि दो संदर्भ एक ही वस्तु को इंगित करते हैं, आपका "आवंटन संरक्षित किया जाएगा"। या अधिक सटीक, आप किसी ऑब्जेक्ट के अन्य संदर्भों पर संचालन के माध्यम से किसी ऑब्जेक्ट के संदर्भ में संचालन के प्रभावों का निरीक्षण कर सकते हैं।
बस याद रखें कि जावा विधि ऑब्जेक्ट पर कॉपी संदर्भों को कॉल करती है, ऑब्जेक्ट्स स्वयं नहीं।
जिस तरह से आप Collections.emptySet()
द्वारा दिए गए सेट में तत्व जोड़ने में सक्षम नहीं होंगे। वह सेट ऑब्जेक्ट अपरिवर्तनीय है।कॉलिंग (उदाहरण के लिए) add
पर एक अपवाद फेंक देगा।
स्रोत
2010-07-20 01:32:34
ठीक है, लेकिन - कुछ अन्य आपरेशन के भीतर अगर मैं जोड़ सकता हूँ के लिए गए थे या मेरी विधि कॉल, कि आवंटन संरक्षित किया जाएगा। ऐसा क्यों है? –
शानदार जवाब स्टीफन, धन्यवाद। –