2013-03-26 5 views
6
class Z 
{ 
    static final int x=10; 
    static 
    { 
     System.out.println("SIB"); 
    } 

} 
public class Y 
{ 
    public static void main(String[] args) 
    { 
     System.out.println(Z.x); 
    } 
} 

आउटपुट: 10 इस मामले में स्थिर प्रारंभिक ब्लॉक क्यों लोड नहीं होता है ?? जब स्थैतिक एक्स कॉल करते हैं तो कक्षा z के सभी स्थिर सदस्य कम से कम एक बार लोड होना चाहिए लेकिन स्थैतिक प्रारंभिक ब्लॉक लोड नहीं हो रहा है।इस साधारण मामले में स्थिर प्रारंभिक ब्लॉक क्यों नहीं चल रहा है?

+4

डुप्लिकेट: http: // stackoverflow।कॉम/प्रश्न/11863800/क्यों-कोड-इन-स्टेटिक-ब्लॉक-करता-निष्पादित नहीं –

उत्तर

1

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

तो बिना हेरफेर किया जा सकता है जब आप Z.x नीचे के रूप में कहते हैं:

System.out.println(Z.x); 

यह कक्षा को प्रारंभ नहीं करेगा, सिवाय इसके कि जब आप Z.x पर कॉल करेंगे, तो उसे उस निश्चित स्मृति स्थान से x मिलेगा।

जेवीएम लोड class Z लोड करते समय स्टेटिक ब्लॉक चलाया जाता है। जो यहां कभी लोड नहीं होता है क्योंकि यह कक्षा को लोड किए बिना सीधे x तक पहुंच सकता है।

0

यह नहीं चलता है क्योंकि कक्षा कभी लोड नहीं होती है।

public class Y 
{ 
    public static void main(String[] args) 
    { 
     Z z new Z(); //will load class 
     System.out.println(Z.x); 
    } 
} 

के बाद से Z पर x क्षेत्र static final साथ घोषित किया गया है वे एक निश्चित स्मृति स्थान में बनाया जाता है। इस क्षेत्र तक पहुंचने के लिए कक्षा को लोड करने की आवश्यकता नहीं है।

1

संकलन समय Zx मूल्य 10 हो जाता है, क्योंकि

static final int x=10; is constant 

तो संकलक नीचे दिए गए की तरह कोड बनाता एक्स अंतिम नहीं होता तो इनलाइन

System.out.println(10); //which is not calling Z class at runtime 
+0

+1 यह एक कारण प्रतीत होता है। 'अंतिम' कीवर्ड को हटाने से स्थिर ब्लॉक निष्पादित होता है। थोड़े संकलक अनुकूलन हो सकता है। – Apurv

+0

@Apurv: यह सब इस प्रश्न से जुड़े डुप्लिकेट में बहुत अच्छी तरह से समझाया गया है (http://stackoverflow.com/questions/11863800/why-code-in-static-block-does-not-execute) – NPE

+0

@NPE माफी , मैंने उन उत्तरों को नहीं पढ़ा। – Apurv

0

के बाद, उस मामले JVM है में कक्षा 'जेड' लोड करने के लिए और फिर केवल स्थिर ब्लॉक निष्पादित किया जाएगा। अब JVM को 'Z' वर्ग लोड करने की आवश्यकता नहीं है, इसलिए स्थैतिक ब्लॉक निष्पादित नहीं किया गया है।

1

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

0

स्थिर स्थिर के रूप में घोषित होने पर निरंतर स्थिर निरंतर कहा जाता है। जब एसओपी (जेएक्स) संकलन करते समय कक्षा y & संकलित करते समय संकलक सोप (10) बीसीजेड x के साथ एसओपी (जेएक्स) को प्रतिस्थापित करता है तो यह एक पूर्ण निरंतर स्थिरता है जिसका अर्थ है बाइट कोड क्लास वाई में क्लास जेड का उपयोग नहीं करते हैं, इसलिए कक्षा वाई कक्षा चलाते समय जेड लोड नहीं है कि क्यों कक्षा जेड का एसआईबी निष्पादित नहीं है।

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