2012-07-05 21 views
35

क्यों से पहले निर्माता पूरा करता है एक अंतिम चर प्रारंभ किया जाना चाहिए?क्यों एक अंतिम चर प्रारंभ किया जाना चाहिए?

public class Ex 
{ 
    final int q; 
} 

मुझे इस कोड संकलन मैं इस

अं तरह त्रुटि मिलती है: चर q प्रारंभ कर दिया गया है नहीं हो सकता है

+0

अंतिम कीवर्ड की एक संपत्ति यह सुनिश्चित करता है कि कि एक चर राज्य को बदल नहीं सकते बाद यह शुरू कर दिया गया है। यह उपयोगकर्ता को घोषित करने या कन्स्ट्रक्टर में प्रारंभ करने के लिए मजबूर करता है। –

+1

कृपया देखें [यह] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.4)। – user1329572

+3

एक 'अंतिम' फ़ील्ड एक बार और केवल एक बार सेट किया जाना चाहिए। कंपाइलर केवल यह सुनिश्चित कर सकता है कि यह एक कन्स्ट्रक्टर में सेट होने पर यह मामला है। एक कक्षा में अंतिम के –

उत्तर

2

final संशोधक चर मूल्य changeing से अपने को रोकता है, इसलिए आपके पास इसे शुरू करने के लिए जहां आप इसे घोषित करते हैं।

14

क्योंकि final संशोधित चर करने से रोकता है, लेकिन यह कुछ बिंदु पर प्रारंभ हो गया है, और निर्माताओं के ऐसा करने के लिए सही जगह है।

आपके मामले में, यह एक blank final कहा जा सकता है क्योंकि यह जब घोषित आरंभ नहीं किया है। तो आप कुछ जगह पर यह करने के लिए एक मूल्य निर्दिष्ट करने की जरूरत है और constructor जगह आप इस मामले में यह करने के लिए है

0

Final modifierchange your variable value की अनुमति नहीं है।

0

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

11

एक final चर के मूल्य केवल एक बार सेट किया जा सकता है। कन्स्ट्रक्टर एक वर्ग के लिए कोड में एकमात्र जगह है जिसे आप गारंटी दे सकते हैं कि यह सच रहेगा; कन्स्ट्रक्टर को केवल एक वस्तु के लिए कभी-कभी बुलाया जाता है लेकिन अन्य तरीकों को कई बार बुलाया जा सकता है।

6

final कीवर्ड एक क्षेत्र के लिए लागू किया दो प्रभाव में से एक है:

    एक आदिम पर
  • , इसे बदला जा रहा है (एक पूर्णांक मूल्य नहीं बदल सकते हैं)
  • पर से आदिम का मूल्य से बचाता है एक वस्तु है, यह बदले जाने से "चर का मान", जो है, वस्तु के संदर्भ में, रोकता है। यही कहना है कि, यदि आपके पास final HashMap<String,String> a है, तो आप इसे केवल एक बार सेट कर पाएंगे, और आप this.a=new HashMap<String,String>(); फिर से करने में सक्षम नहीं होंगे, लेकिन कुछ भी आपको this.a.put("a","b") करने से नहीं रोकता है, क्योंकि यह नहीं करता है संदर्भ को संशोधित करें, केवल वस्तु की सामग्री।
9

final परिवर्तक घोषणा या एक निर्माता में प्रारंभ किया जाना चाहिए।

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

यह Wikipedia excerpt यह अच्छी तरह से बताते हैं:

एक अंतिम चर केवल एक बार प्रारंभ किया जा सकता है, या तो एक प्रारंभकर्ता या एक काम के बयान के माध्यम से। यह घोषणा के बिंदु पर प्रारंभ करने की आवश्यकता नहीं होती है: यह एक "खाली अंतिम" चर कहा जाता है।कक्षा के एक खाली अंतिम उदाहरण चर को निश्चित रूप से कक्षा के प्रत्येक निर्माता के अंत में असाइन किया जाना चाहिए जिसमें इसे घोषित किया गया है; इसी प्रकार, एक खाली अंतिम स्थैतिक चर को निश्चित रूप से उस वर्ग के स्थिर प्रारंभकर्ता में असाइन किया जाना चाहिए जिसमें इसे घोषित किया गया है: अन्यथा, दोनों मामलों में एक संकलन-समय त्रुटि होती है। (नोट: चर एक संदर्भ है, तो इसका मतलब है कि चर नहीं किसी अन्य वस्तु के संदर्भ के लिए फिर से बाध्य किया जा सकता है लेकिन उद्देश्य यह है कि यह संदर्भ देता है अभी भी परिवर्तनशील है, अगर यह मूल रूप से परिवर्तनशील था।।)

29

आधिकारिक कारण यह है कि यह द्वारा परिभाषित किया गया है Java Language Spefication 8.3.1.2:

एक खाली अंतिम उदाहरण चर निश्चित रूप से वर्ग जिसमें यह घोषित किया जाता है के हर निर्माता के अंत में देना चाहिये; अन्यथा एक संकलन-समय त्रुटि होती है।

एक खाली अंतिम अंतिम चर है जिसका घोषणापत्र प्रारंभकर्ता (यानी आप जो वर्णन करते हैं) की कमी है।

+0

डिफ़ॉल्ट कन्स्ट्रक्टर को डिफ़ॉल्ट मानों के लिए प्रारंभ करना चाहिए था? यह गैर अंतिम चर के लिए करता है लेकिन अंतिम चर के लिए क्यों नहीं? – Sunil

+2

यह उत्तर केवल व्यवहार ओपी को संदर्भित करता है। यह व्यवहार के कारण का कारण नहीं बताता है, ओपी सवाल पूछा गया है। – ineedahero

+0

@ineedahero मुझे लगता है कि मैंने ओप के प्रश्न का उत्तर दिया है: क्योंकि भाषा को इस तरह परिभाषित किया गया है। यह क्यों परिभाषित किया गया था कि जिस तरह से कोई भी विनिर्देश लिखा है और जब तक कि वह आस-पास नहीं है, हम केवल अनुमान लगा सकते हैं ... – assylias

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