यह एक नया स्मृति स्थान का आवंटन होगा? या बस मूल मूल्य को प्रतिस्थापित करें?
जावा वास्तव में किसी भी गारंटी देता है कि चर स्मृति स्थल के अनुरूप होगा नहीं बनती है; उदाहरण के लिए, अपने विधि इस प्रकार है कि i
एक रजिस्टर — में संग्रहित है या यहां तक कि बिल्कुल भी जमा नहीं किया जा सकता है, संकलक देख सकते हैं कि आप वास्तव में कभी अपने मूल्य का उपयोग करें, या अगर यह कोड के माध्यम से पता लगा सकते हैं में अनुकूलित किया जा सकता है और उचित मूल्यों का सीधे उपयोग करें।
लेकिन इसे एक तरफ सेट करना। । । अगर हम यहां अमूर्तता लेते हैं कि एक स्थानीय चर कॉल कॉल पर स्मृति स्थान को इंगित करता है, तो i = 11
उस स्मृति स्थान पर मान को संशोधित करेगा। इसे एक नए मेमोरी लोकेशन का उपयोग करने की आवश्यकता नहीं होगी, क्योंकि परिवर्तनीय i
पुरानी जगह का जिक्र करने वाली एकमात्र चीज थी।
क्या इसका मतलब यह है कि प्राइमेटिव अपरिवर्तनीय हैं?
हाँ और नहीं: हाँ, प्राइमेटिव अपरिवर्तनीय हैं, लेकिन नहीं, यह उपरोक्त की वजह से नहीं है।
जब हम कहते हैं कि कुछ म्यूटेबल है, तो हमारा मतलब है कि इसे उत्परिवर्तित किया जा सकता है: अभी भी वही पहचान होने पर बदला गया है। उदाहरण के लिए, जब आप अपने बालों को उगते हैं, तो आप खुद को बदल रहे हैं: आप अभी भी हैं, लेकिन आपके गुणों में से एक अलग है।
प्राइमेटिव के मामले में, उनके सभी गुण उनकी पहचान से पूरी तरह से निर्धारित होते हैं; 1
हमेशा 1
का मतलब है, कोई फर्क नहीं पड़ता कि, और 1 + 1
हमेशा 2
है। आप इसे बदल नहीं सकते।
एक दिया int
चर मूल्य 1
है, तो आप के बजाय मूल्य 2
के लिए इसे बदल सकते हैं, लेकिन यह है कि पहचान की कुल परिवर्तन है: यह अब एक ही मूल्य यह पहले था है। यह मेरे बजाय किसी और को इंगित करने के लिए me
बदलने जैसा है: यह वास्तव में मुझे में परिवर्तित नहीं करता है, यह केवल me
बदलता है।
वस्तुओं के साथ
, ज़ाहिर है, आप अक्सर दोनों कर सकते हैं:
StringBuilder sb = new StringBuilder("foo");
sb.append("bar"); // mutate the object identified by sb
sb = new StringBuilder(); // change sb to identify a different object
sb = null; // change sb not to identify any object at all
आम भाषा में, इन दोनों को "sb
बदलते" के रूप में वर्णित किया जाएगा, क्योंकि लोगों को "sb
" दोनों उल्लेख करने के लिए प्रयोग करेंगे परिवर्तनीय (जिसमें एक संदर्भ शामिल है) और ऑब्जेक्ट पर यह संदर्भित करता है (जब यह एक को संदर्भित करता है)। इस तरह की ढीलापन ठीक है, जब तक कि आप महत्वपूर्ण होने पर भेद को याद रखें।
यह स्मृति में नई जगह नहीं बनाएगा। – Maroun
यह मूल को प्रतिस्थापित करेगा। जावा प्राइमेटिव ** ** ऑब्जेक्ट्स नहीं हैं। 'इंटेगर '(और अन्य आदिम रैपर वर्ग) ** ** अपरिवर्तनीय हैं। –
@BrianRoach नहीं उसने नहीं किया। आपके तर्क से, स्ट्रिंग्स म्यूटेबल हैं: 'स्ट्रिंग स्ट्र = "टेस्ट"; str = "newStr"; '। ओपी के सवाल का जवाब देने के लिए, वे वास्तव में अपरिवर्तनीय हैं। यदि आप 'i ++' पर विचार करते हैं, तो यह वास्तव में है: 'i = i + 1'। जो आप देख सकते हैं वह 'i' का मान लेता है, एक जोड़ता है और इस नए मान पर' i' को फिर से सौंपता है। –