java - क्यों स्थिर initializer ब्लॉक इस सरल मामले में नहीं चला?




static load (4)

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

इसलिए, जब आप नीचे Zx कहते हैं:

System.out.println(Z.x);

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

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

 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 क्यों स्थिर इनिशियलाइज़ेशन ब्लॉक इस मामले में लोड नहीं होता ?? जब स्थिर x कॉल तो कक्षा z के सभी स्थिर सदस्य कम से कम एक बार लोड होना चाहिए, लेकिन स्थिर प्रारंभिक ब्लॉक लोड नहीं हो रहा है।


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


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

static final int x=10; is constant

इसलिए इनलाइन के बाद कंपाइलर कोड को नीचे दिया गया है

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

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





initialization