2012-04-21 19 views
11

मुझे पता है कि एक बार अंतिम चर के पास एक मान दिया गया है, इसे बदला नहीं जा सकता है। हालांकि मैं अभी इस बारे में सवालों की एक जोड़ी:जावा - अंतिम चर

  • जब मैं एक क्षेत्र है, एक वर्ग के बाहर static final JButton button; कहते हैं, और उसके बाद main विधि में, यह एक मूल्य निर्दिष्ट button = new JButton("OK"); कोशिश, मैं कोई त्रुटि मिलती है मुझे अंतिम संशोधक को हटाने के लिए कह रहा है? हालांकि मूल button वैरिएबल अभी तक किसी ऑब्जेक्ट का संदर्भ नहीं देता है, मैं इंप्रेशन के तहत था, मैं इसे एक बार असाइन कर सकता था?

  • दूसरा, अगर मैं पूरी तरह से button के संदर्भ को हटा देता हूं तो मेरे पास कक्षा के बाहर static final JButton button; है, मेरा आईडीई दावा करता है "रिक्त अंतिम फ़ील्ड बटन प्रारंभ नहीं किया जा सकता है।" क्या इसका मतलब यह है कि सभी अंतिम फ़ील्ड आरंभ किया जाना चाहिए? और यदि हां, तो उन्हें वहां शुरू किया जाना चाहिए और फिर जैसा कि मैं इसे बाद में शुरू नहीं कर सकता।

  • इसके अलावा, मूर्ख सवाल, लेकिन मेरी प्रारंभिक धारणा है कि जब एक अंतिम चर को किसी उदाहरण या डेटा प्रकार के संदर्भ में संदर्भित किया जाता है तो इसे किसी अन्य चीज़ के लिए असाइन नहीं किया जा सकता है, है ना?

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

public class FinalVarTester { 

    static final JButton button; 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     Container container = frame.getContentPane(); 
     container.setLayout(new BorderLayout()); 
     button = new JButton("OK"); 
     container.add(button, BorderLayout.SOUTH); 
    } 

} 

उत्तर

18

आपको एक स्थैतिक अंतिम चर या तो एक स्थिर प्रारंभकर्ता या सीधे शुरू करना चाहिए। तो या तो

static final JButton button = new JButton(); 

या

static final JButton button; 

static { 
    button = new JButton(); 
} 

जावा भाषा विनिर्देश इसके बारे में कुछ और प्रलेखन है: section about final variables निर्दिष्ट करता है तुम क्यों संकलन त्रुटि मिलती है:

It is a compile-time error if a final variable is assigned to unless it is definitely unassigned (§16) immediately prior to the assignment.

और chapter 16 के बारे में वार्ता निश्चित असाइनमेंट

+0

यह घोषणा के समय में अंतिम चर प्रारंभ करने में अनिवार्य नहीं है? –

0

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

3

final फ़ील्ड वास्तव में प्रारंभ किए जाने चाहिए, क्योंकि यह शेष कार्यक्रम के लिए उनका मूल्य होगा।

इसका अपवाद यह है कि final परिवर्तक को कन्स्ट्रक्टर में प्रारंभ किया जा सकता है। चूंकि स्थैतिक फ़ील्ड किसी उदाहरण से संबंधित नहीं हैं, उन्हें प्रारंभिक प्रारंभ किया जाना चाहिए (कोई कन्स्ट्रक्टर नहीं है) प्रत्यक्ष प्रारंभिकरण, या स्थिर प्रारंभिक ब्लॉक ऐसा करने के विकल्प हैं।

आपके अंतिम प्रश्न के संबंध में, हां, यही कारण है कि इसे अंतिम कहा जाता है।

0

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

public class FinalVarTester { 

    static final JButton button = new JButton("OK"); 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     Container container = frame.getContentPane(); 
     container.setLayout(new BorderLayout()); 
     container.add(button, BorderLayout.SOUTH); 
    } 
} 
0

सही जवाब है कि एक static final वर हमेशा वर्ग init समय में प्रारंभ है।

0

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

अंतिम चर

की

प्रकार

1) उदाहरण के अंतिम वैरिएबल:

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

2) स्थिर अंतिम VARIABLE

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

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

तो आपके मामले में इसे स्थैतिक प्रारंभकर्ता ब्लॉक के माध्यम से प्रारंभ किया जाना चाहिए जो वर्ग लोड होने पर प्रारंभ होता है।

रेफरी: http://en.wikipedia.org/wiki/Final_(Java)

0

एक बेहतर अच्छा codding रास्ता:

public class FinalVarTester 
{  
    static final JButton button; 
    public FinalVarTester() 
    {  
     JFrame frame = new JFrame(); 
     Container container = frame.getContentPane(); 
     container.setLayout(new BorderLayout()); 
     container.add(button, BorderLayout.SOUTH); 
     button = new JButton("OK"); 
    } 
    public static void main(String[] args)  
    { 
     FinalVarTester vTester = new FinalVarTester();  
    } 
} 
संबंधित मुद्दे