2009-08-08 7 views
44

में अंतिम चर हेरफेर किसी को भी मुझे बता सकते क्या जावा के संदर्भ में निम्न पंक्ति का अर्थ है:जावा

अंतिम चर अभी भी किया जा चालाकी से कर सकते हैं, जब तक यह

जहाँ तक अपरिवर्तनीय है जैसा कि मुझे पता है, किसी चर को अंतिम के रूप में घोषित करके, आप इसे फिर से नहीं बदल सकते हैं, फिर शब्द के साथ उनका क्या अर्थ है ऊपर उल्लिखित?

उत्तर

95

इसका मतलब है कि यदि आपका अंतिम चर एक संदर्भ प्रकार है (यानी पूर्णांक की तरह एक आदिम नहीं) है, तो यह केवल संदर्भ बदला नहीं जा सकता है कि है। इसे किसी भिन्न ऑब्जेक्ट को संदर्भित करने के लिए नहीं बनाया जा सकता है, लेकिन यदि ऑब्जेक्ट इसे संदर्भित करता है तो ऑब्जेक्ट के फ़ील्ड को तब भी बदला जा सकता है, यदि वर्ग इसे अनुमति देता है।

final StringBuffer s = new StringBuffer(); 

StringBuffer की सामग्री अभी भी मनमाने ढंग से बदला जा सकता है: उदाहरण के लिए:

s.append("something"); 

लेकिन आप यह नहीं कह सकते:

s = null; 

या

s = anotherBuffer; 

पर दूसरी ओर:

final String s = ""; 

स्ट्रिंग्स अपरिवर्तनीय हैं - वहां कोई ऐसी विधि नहीं है जो आपको स्ट्रिंग को बदलने में सक्षम करे (जब तक कि आप प्रतिबिंब का उपयोग न करें - और नरक में जाएं)।

+0

वही चीज़ संग्रह के लिए भी सही है? – pramodc84

+0

@ pramodc84: यह सभी चर के लिए समान है। हालांकि अधिकांश संग्रह म्यूटेबल हैं। –

+0

तो मैं इसे प्रतिबिंब के साथ कैसे बदल सकता हूं? =) –

16

आप एक जावा वस्तु के लिए एक अंतिम संदर्भ है, तो आप अभी भी इसे हेरफेर कर सकते हैं, लेकिन इसके संदर्भ बदल नहीं सकते। उदाहरण के लिए इस कोड को पूरी तरह से कानूनी है:

import javax.swing.JLabel; 

class Test1 { 
    private final static JLabel l = new JLabel("Old text"); 
    public static void main(String[] args) { 
     System.err.println(l.getText()); 
     l.setText("New Text"); 
     System.err.println(l.getText()); 
    } 
} 

लेकिन आप यह नहीं कह सकते:

l = new JLabel("Newest Text"); 

एल पहला काम करने के बाद। ध्यान दें कि आप इस हालांकि कर सकते हैं: क्योंकि जब मैं घोषित किया जाता है यह कुछ भी भी रिक्त नहीं करने के लिए आवंटित नहीं किया गया है

import javax.swing.JLabel; 

class Test1 { 
    public static void main(String[] args) { 
     final JLabel l; 
     String s = getArbitaryString(); // Assume this method returns a string 
     l = new JLabel(s); 
     System.err.println(l.getText()); 
    } 
} 

यह किया जा सकता है। इसलिए आपको केवल एक बार कुछ असाइन करने की अनुमति है।

वही बात प्राइमेटिव के लिए जाती है। आप इस तरह यह करने के लिए एक मूल्य निर्दिष्ट कर सकते हैं:

class Test1 { 
    public static void main(String[] args) { 
     final int i; 
     i = 2; 
    } 
} 

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

-2

आप अभी भी प्रतिबिंब का उपयोग कर 'अंतिम' चर बदल सकते हैं।

+1

आप ऐसा कर सकते हैं लेकिन इसका मतलब यह नहीं है। –

+0

दरअसल, आप नहीं कर सकते। आपको java.lang.IleglegalAccessException मिलेगा। –

+0

वास्तव में, आप कर सकते हैं। कोशिश करो। – Javamann

3

के रूप में अन्य लोगों ने कहा, इसका मतलब है कि आप चर बिंदुओं पर वस्तु में हेरफेर कर सकते हैं, लेकिन आप संदर्भ को नहीं बदल सकते हैं (यानी चर करने के लिए किसी अन्य वस्तु आवंटित)।इस तरह के एक List रूप

वस्तुओं है कि डिजाइन द्वारा परिवर्तनशील हैं, बदला जा सकता है (आप उन्हें तत्वों जोड़ सकते हैं) जबकि अगर आप एक अपरिवर्तनीय वस्तु है एक जैसे String या Integer आप इसे बदलने के लिए सक्षम नहीं होगा (सभी संचालन वर्ग String एक नया उदाहरण लौटने का समर्थन करता है, और वास्तविक वस्तु को संशोधित नहीं करता है)।

4

आप अंतिम ऑब्जेक्ट या ऑब्जेक्ट को अंतिम चर को संदर्भित नहीं कर सकते हैं। आप केवल एक बार अंतिम चर निर्दिष्ट कर सकते हैं।

इसका कोई प्रभाव नहीं पड़ता कि आप वस्तु की स्थिति बदल सकते हैं या नहीं। ऑब्जेक्ट को तब भी छेड़छाड़ की जा सकती है जब तक कि इसे इस तरह से कोडित नहीं किया जाता है कि इस हेरफेर को प्रतिबंधित किया गया है। एक अपरिवर्तनीय वस्तु एक वस्तु है जिसका राज्य बदल नहीं सकता है।

0

आप उस विधि पर किसी भी विधि को कॉल कर सकते हैं भले ही विधि उस ऑब्जेक्ट की स्थिति को बदल सके जो संदर्भ इंगित कर रहा है। उदा

final MyClass myClass = new MyClass(); 
myClass.setVar(something); 

इसका कारण यह है myClass को परिवर्तित नहीं कर रहा है, यानी आप myClass = myClass1; नहीं कर रहे हैं ठीक है।

0

वह जो हमेशा मुझे मारता है?

यदि आप वास्तव में सुरक्षित होने के लिए अंतिम चर चाहते हैं, तो आपको स्ट्रिंग [] की प्रतिलिपि वापस करने के लिए बहुत सारे अतिरिक्त कोड की आवश्यकता है।

0

आप उत्परिवर्तनीय अंतिम चर का उपयोग कर सकते हैं उदा। स्ट्रिंगबफर टाइप करें लेकिन आप अपरिवर्तनीय प्रकार के अंतिम चर में हेरफेर नहीं कर सकते हैं।

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

0

हां अंतिम चर संशोधित किया जा सकता है।

final StringBuffer s = new StringBuffer(); 
    // won't work 
    s = new StringBuffer(); 
    //this works 
    s.append("hai"); 

आप संदर्भ नहीं बदल सकते हैं लेकिन ऑब्जेक्ट के फ़ील्ड को संशोधित किया जा सकता है। for more details