2012-06-29 1 views
13

में अंतिम के रूप में ऑब्जेक्ट घोषित करना कोई व्यक्ति नीचे दिए गए कोड के महत्व को स्पष्ट कर सकता है।जावा

class A 
{ 
    int i = 10; 

    public void setI(int b) 
    { 
     i = b; 
    } 

    public int getI() 
    { 
     return i; 
    } 
} 

class Test 
{  
    public static void main(String args[]) throws Throwable 
    { 
     final A ob = new A(); 
     ob.setI(10); 
     System.out.println(ob.getI()); 
    } 
} 

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

उत्तर

31

ओबी किसी अन्य ऑब्जेक्ट को संदर्भित करने में सक्षम नहीं होगा: final keyword

इसे पुन: असाइन नहीं किया जा सकता है। लेकिन आप इसके आंतरिक बदल सकते हैं (यह मूल रूप से अगर यह परिवर्तनीय है)। तो यह काम करता है:

final A ob = new A(); 
    ob.setI(6) 

लेकिन यह नहीं करता है: के रूप में सी ++ के लिए विरोध

final A ob = new A(); 
    ob = new A(); 
+0

तो मूल रूप से यह ऑब्जेक्ट का एक नया उदाहरण निर्दिष्ट करने की अनुमति नहीं देता है? अन्य चीजों के बारे में क्या कहना है: 'छवि img = loadImage ("img.png"); '। क्या आप तब कर सकते हैं: 'img = loadImage ("image.png"); '? या यह अवैध होगा? –

+0

@LinkTheProgrammer आपको क्या लगता है? – NimChimpsky

1

जावा में, सभी वस्तुओं, संकेत दिए गए हैं तो एक final वस्तु बदला जा सकता है, यह सिर्फ कर सकते हैं ' टी कहीं भी नया इंगित करें, यानी, आप इसे असाइनमेंट ऑपरेटर के बाईं ओर नहीं डाल सकते हैं।

3

यदि कोई ऑब्जेक्ट final है तो आप सामान्य रूप से आंतरिक परिवर्तन करने वाले किसी भी तरीके को कॉल कर सकते हैं, लेकिन आप किसी भिन्न ऑब्जेक्ट को इंगित करने के संदर्भ को पुन: असाइन नहीं कर सकते हैं। ऐसा करने का प्रयास करें:

final A ob = new A(); 
ob = new A(); 

और ध्यान दें कि कोड संकलित नहीं होगा।

इसे निरंतर संदर्भ के रूप में सोचें।

3

इसका मतलब है कि निम्नलिखित संभव नहीं है:

final A ob = new A(); 
ob = new A(); // This is not possible 

चर ob भी है कि पहले इसे करने के लिए सौंपा गया था वर्ग A के कहने के पास भेजेगा। इस मामले में final कीवर्ड का अर्थ यही है। इसका मतलब यह है कि आप ob के गुणों को संशोधित कर सकते हैं क्योंकि यह A के किसी भी अन्य उदाहरण की तरह एक सामान्य वस्तु है।

2

ठीक है, वस्तु के मामले में, संदर्भ का मूल्य वस्तुओं के लिए पता है। तो ओबी का मान new A(); द्वारा बनाए गए ऑब्जेक्ट का पता होगा जो अंतिम होगा और आप इसका मूल्य बदल नहीं पाएंगे। जिसका मतलब है, आप इस संदर्भ में एक नई वस्तु असाइन नहीं कर सकते हैं।

आप इस तरह से लिख नहीं सकते हैं।

final A ob = new A(); 

ob= new A(); // not allowed 
1

जावा में कोई स्थिर (अंतिम) वस्तु नहीं होगी। ऑब्जेक्ट्स हेप मेमोरी एरिया में बनाए जाते हैं। और हम किसी भी समय ऑब्जेक्ट को संशोधित कर सकते हैं।
जावा में केवल स्थिर (अंतिम) संदर्भ हैं: - इसका मतलब है कि आप संदर्भ को संशोधित नहीं कर सकते हैं और इसे किसी अन्य ऑब्जेक्ट को फिर से असाइन नहीं कर सकते क्योंकि यह स्थिर है और अंतिम संदर्भ से बाहर केवल एक वस्तु को संदर्भित किया जा रहा है घोषणा के दौरान सौंपा गया।

इसलिए:

final A objectA = new A(); 
objectA.setI(6); 

मान्य नहीं है क्योंकि हम केवल वस्तु सामग्री, नहीं संदर्भ बदल रहे हैं है।

लेकिन:

final A objectA = new A(); 
    objectA = new A(); 

मान्य नहीं है क्योंकि आप संदर्भ संशोधित करने के लिए कोशिश कर रहे हैं है।

10

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

उदाहरण के लिए, आप:

final int x = 7; 
final Object y = new Object(); 

आप डेटा के बारे में सोच सकते स्मृति में इस तरह से प्रतिनिधित्व किया जा रहा:

+----------+----------+ 
| block | value | 
+----------+----------+ 
| 1001 | 7  | 
| 1002 | 2110 | 
+----------+----------+ 

चर्चा के लिए, कैसे के विवरण बाहर छोड़ देना जावा वास्तव में स्मृति का प्रबंधन करता है (क्योंकि मुझे इसके बारे में ज्यादा जानकारी नहीं है)। तो, ऊपर दिए गए उदाहरण में, ब्लॉक 1001 को चर x द्वारा दर्शाया गया है, और 1002 द्वारा y। दोनों अंतिम चर हैं जिसका अर्थ है कि उनके द्वारा प्रस्तुत मूल्यों को बदला नहीं जा सकता है। एक्स के मामले में, यह 7 है, जो वास्तविक मूल्य है, लेकिन वाई के मामले में, 2110 सिर्फ एक अन्य स्मृति स्थान का संदर्भ है। दोनों बदल नहीं सकते हैं लेकिन कारण आदिम प्रकार चर स्थिरांक बनने का कारण यह है कि वे वास्तविक मूल्यों का प्रतिनिधित्व करते हैं। लेकिन वास्तव में, आप ऑब्जेक्ट प्रकार चर के लिए भी यही कह सकते हैं कि स्थिरांक वे प्रतिनिधित्व करते हैं संदर्भ हैं। तो अंतिम कीवर्ड इस संबंध में काफी संगत है।

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