2014-07-22 11 views
27
class Hello12 { 
    static int b = 10; 
    static { 
     b = 100; 
    } 
} 

class sample { 
    public static void main(String args[]) { 
     System.out.println(Hello12.b); 
    } 
} 

कोड ऊपर चल रहा है पर क्योंकि जब मैंने Hello क्लास कहा जाता है, स्थिर ब्लॉक पहले से 100 ख के मूल्य की स्थापना और यह प्रदर्शित निष्पादित किया जाता है उत्पादन 100 के रूप में आता है। लेकिन जब मैं इस कोड लिखने:जावा वर्गों और स्थिर ब्लॉक

class Hello12 { 
    static { 
     b = 100; 
    } 
    static int b = 10; 
} 

class sample { 
    public static void main(String args[]) { 
     System.out.println(Hello12.b); 
    } 
} 

यहाँ उत्पादन 10. मैं 100 के रूप में जवाब की उम्मीद कर रहा हूँ क्योंकि एक बार स्थिर ब्लॉक निष्पादित किया जाता है यह 100 तो जब मुख्य में() के रूप में मूल्य ख दिया के रूप में आता, मैंने कहा हैलो.बी इसे बी (= 100) को संदर्भित किया जाना चाहिए था। दोनों कोडों में बी को आवंटित स्मृति कैसे दी जाती है?

+3

+1। अभ्यास में, 'अंतिम' का प्रयोग करें। – djechlin

उत्तर

49

कक्षाएं, Section 12.4.2 of the JLS राज्यों के लिए "विस्तृत प्रारंभ प्रक्रिया" में:

इसके बाद, शाब्दिक क्रम में या तो वर्ग चर initializers और वर्ग के स्थिर initializers, या इंटरफेस के क्षेत्र initializers, निष्पादित, भले ही वे एक ही ब्लॉक थे।

इसका मतलब है कि यह है के रूप में यदि पहला उदाहरण था:

b = 10; 
b = 100; 

और दूसरा उदाहरण था:

b = 100; 
b = 10; 

पिछले काम "जीत", अपने उत्पादन समझा।

+9

यह स्वीकार्य उत्तर होना चाहिए! –

+0

@kocko यह ठीक है। आइए rgettman [populist] (http://stackoverflow.com/help/badges/62/populist) बैज प्राप्त करने में सहायता करें। दुर्भाग्यवश, इसका मतलब है कि स्वीकृत उत्तर में 10 अपवॉट होने की आवश्यकता है ... – Justin

+5

यह 'टेक्स्ट ऑर्डर' में चलाए जाने पर संकलित क्यों होता है? निश्चित रूप से स्थिर बी में सेट होने पर 'बी' घोषित नहीं किया गया है? – Holloway

4

स्टेटिक्स का मूल्यांकन कार्यक्रम में दिखाई देने के क्रम में किया जाता है।

16

स्थिर ब्लॉक और स्थैतिक चर प्रारंभिक क्रम में प्रारंभ होते हैं जिसमें वे स्रोत में दिखाई देते हैं। यदि आपका कोड है:

class Hello12 { 

    static int b = 10; 
    static { 
    b = 100; 
    } 

} 

परिणाम 100

6

है कैसे कोड किस क्रम में निष्पादित किया जाता है के सवाल का जवाब देने के अलावा, मैं क्यों एक स्थिर ब्लॉक का उल्लेख कर सकते पता है कि तुम अनुमान लगा रहा हूँ भी करना चाहते हैं एक स्थिर चर जो अभी तक पाठ/घोषित नहीं किया गया है।

जबकि section 12.4.2 of the JLS व्याख्या नहीं करता है कि स्थिर ब्लॉक और स्थिर चर शाब्दिक आदेश है कि वे दिखाई देते हैं में क्रियान्वित कर रहे हैं, section 8.3.3 of the JLS बताते हैं जब आप संदर्भित कर सकते हैं क्या है, और आप देख सकते हैं कि The use is not on the left hand side of an assignment; की हालत में विफल रहता है, दूसरी बार में अपने स्थिर ब्लॉक की इजाजत दी उदाहरण के लिए एक स्थैतिक चर को संदर्भित करने के लिए जो पाठ रूप से क्रमशः घोषित/निष्पादित नहीं किया गया है।

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