2011-08-16 15 views
23

मैं वर्तमान में सिएरा & बेट्स पुस्तक के साथ एस (ओ) सीजेपी तैयार कर रहा हूं।हम अज्ञात आंतरिक कक्षाओं के साथ अंतिम कीवर्ड का उपयोग क्यों करते हैं?

आंतरिक कक्षाओं (विधि स्थानीय या अज्ञात) के बारे में, वे कहते हैं कि हम स्थानीय चरों तक नहीं पहुंच सकते हैं क्योंकि वे ढेर पर रहते हैं और कक्षा द्वारा वापस आ सकते हैं और फिर कोशिश करने की कोशिश कर सकते हैं ढेर पर मौजूद इन चरों तक पहुंच, लेकिन विधि समाप्त होने के बाद अब मौजूद नहीं है ...

जैसा कि हम सभी जानते हैं, हम अंतिम कीवर्ड का उपयोग कर इसे बाईपास कर सकते हैं। पुस्तक में वे यही कहते हैं लेकिन वे वास्तव में यह नहीं बताते कि अंतिम कीवर्ड का क्या प्रभाव है ... जहां तक ​​मुझे पता है, एक विधि पर अंतिम कीवर्ड का उपयोग करके स्थानीय वैरिएबल इसे ढेर पर नहीं बना देता है ... तो कक्षा एक अंतिम चर का उपयोग करने में सक्षम कैसे होगी जो अभी भी ढेर पर रहती है जबकि कोई और ढेर नहीं हो सकता ???

मुझे लगता है कि आंतरिक कक्षा के अंदर इस अंतिम स्थानीय चर के किसी प्रकार की "प्रतिलिपि" होनी चाहिए। चूंकि मान परिवर्तित नहीं हो सकता है, इसलिए इस जानकारी को डुप्लिकेट क्यों न करें ... क्या कोई इसकी पुष्टि कर सकता है या मुझे बता सकता है कि मुझे कुछ याद आ रहा है?

उत्तर

18

आपकी अंतर्ज्ञान सही है, क्योंकि परिवर्तनीय अंतिम है, इसकी प्रतिलिपि बनाना सुरक्षित है। निश्चित रूप से संदर्भ प्रकारों के लिए इसका अर्थ यह है कि ऑब्जेक्ट के संदर्भ की प्रतिलिपि बनाना, न कि उस वस्तु को संदर्भित करता है।

11

कंपाइलर आंतरिक वर्ग को बाहरी वर्ग में अंतिम क्षेत्र में जाने के लिए कवर के तहत अंतिम संदर्भ की प्रतिलिपि बनाने वाली सूक्ष्म चालबाजी का उपयोग करता है। प्रतिलिपि यह है कि फ़ील्ड अंतिम क्यों होना चाहिए ताकि मूल्य बदल न सके।

उदा। देखें http://tech-read.com/2008/06/19/why-inner-class-can-access-only-final-variable/

+0

हां लेकिन संकलक अभी भी चर को कॉपी कर सकता है भले ही यह अंतिम नहीं था। मेरा अनुमान है कि इसे अंतिम होने की आवश्यकता है कोड को और स्पष्ट करता है कि यह नहीं बदलेगा। –

+2

समस्या - मेरी समझ के लिए - यह है कि यदि आपको इसे अंतिम होने की आवश्यकता नहीं है, तो आपको बाहरी परिवर्तनीय परिवर्तनों को बदलने और अद्यतन करने के अधिक सावधान ट्रैक रखने की आवश्यकता है। क्या होगा यदि आपके पास आंतरिक वर्ग के कई उदाहरण हैं और उन्हें सभी को अपडेट करने की आवश्यकता है? –

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