2014-12-16 4 views
20

उदाहरण के लिए, नीचे दिए गए कोड स्नैप पर विचार करें:क्यों हम वर्ग के नाम के माध्यम से स्थिर ब्लॉक में स्थिर अंतिम चर के मूल्य निर्धारित नहीं कर सकते

public static final int a; 
public static final int b; 

static { 
    a = 8;  // it's working 
    Test.b = 10; // compilation error Test.b cannot be assigned. 
} 

क्यों हम Test की एक स्थिर ब्लॉक के अंदर Test.b = 10; उपयोग नहीं कर सकते कक्षा ही? कक्षा के नाम के बिना यह ठीक काम कर रहा है।

क्या इसके पीछे कोई कारण है?

+3

क्योंकि आपकी कक्षा अभी तक प्रारंभिक नहीं है जब आप एक स्थिर प्रारंभकर्ता में हैं? इसके अलावा शायद क्योंकि जेएलएस इसे मना करता है ... – fge

+2

क्या आप रुचि रखते हैं कि "जेएलएस का कौन सा हिस्सा इस पर प्रतिबंध लगाता है" या "इस तरह से डिजाइन की गई भाषा क्यों थी"? –

+0

यहां गलत हो सकता है, लेकिन शायद इसकी वजह है कि आपके पास 'test'b' को 'अंतिम' –

उत्तर

7

एक स्थिर अंतिम चर उपयोग से पहले शुरू किया जाना चाहिए। इसे सीधे घोषणा समय, या एक स्थिर ब्लॉक में शुरू किया जा सकता है।

लेकिन जब आप class.var = x का उपयोग करते हैं तो इसे प्रारंभिक रूप में नहीं बल्कि एक असाइनमेंट के रूप में देखा जाता है।

जेडीके 7 के साथ, त्रुटि अंतिम चर पर मान निर्दिष्ट नहीं कर सकता है।

बताते हैं यही कारण है कि यह काम करता है अगर आप final कीवर्ड

class Test { 

    static final int a = 2; // initialization at declaration time 
    static final int b; 
    static final int c; 

    static { 
     b = 4; // initialization in static block 
     Test.c = 6; // error : cannot assign a value to final variable c 
    } 
    ... 

} 

संपादित

JLS में प्रारंभ के लिए सही शब्द JLS से निश्चित assignement

निकालें है निकालें:

स्थानीय वी के प्रत्येक उपयोग के लिए पहुंच योग्य या खाली अंतिम फ़ील्ड x, x निश्चित रूप से एक्सेस से पहले असाइन किया जाना चाहिए, या संकलन-समय त्रुटि उत्पन्न होती है।

इसी प्रकार, प्रत्येक रिक्त अंतिम चर को सबसे अधिक बार असाइन किया जाना चाहिए; यह होना चाहिए जब इसे असाइनमेंट होता है तो निश्चित रूप से असाइन नहीं किया जाता है।

इस तरह के एक काम करता है, तो और होने के लिए परिभाषित किया गया है केवल यदि या तो चर का सरल नाम (या एक क्षेत्र के लिए, अपने सरल नाम इस के योग्य) एक के बाएं हाथ की पक्ष पर होता है असाइनमेंट ऑपरेटर।

एक खाली अंतिम चर के लिए हर काम के लिए, चर काम से पहले निश्चित रूप से असाइन नहीं किए गए होना चाहिए, या एक संकलन समय त्रुटि उत्पन्न होती है।

मेरा जोर देता है, लेकिन मुझे लगता है कि यह त्रुटि का वास्तविक कारण है।

+1

मुझे नहीं लगता कि यह काफी सही है, हालांकि यह सही लाइनों के साथ होना चाहिए। यह कहता है कि आप रिक्त अंतिम चर को असाइन नहीं कर सकते हैं जब तक कि उस बिंदु पर निश्चित रूप से असाइन नहीं किया जाता है, लेकिन यह निश्चित रूप से असाइन नहीं किया जाता है। ऐसा लगता है कि आप उद्धृत बिट का उल्लंघन नहीं करते हैं। –

+0

@ चीयस्टिक-सुरक्षा: मैं वास्तव में एक वकील नहीं हूं, और अंग्रेजी मेरी पहली भाषा नहीं है, मुझे लगता है कि यहां महत्वपूर्ण शब्द * सरल नाम * है क्योंकि 'test.b' एक साधारण नाम नहीं है। –

+0

हां, वह वाक्यांश महत्वपूर्ण है, लेकिन यह सब कहता है कि 'test.b = 10' "ऐसा असाइनमेंट नहीं है", यानी, यह कोड जेएलएस के इस बिट के लिए नहीं है। –

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