2013-09-24 3 views
32

नहीं कहा जा रहा है जो क्या हो रहा है?स्टेटिक ब्लॉक को

public class MagicFinal { 

    public static void main(String[] args) { 
     System.out.println(A.s); 
    } 
} 

class A { 
    static { 
     System.out.println("class has been loaded"); 
    } 

    public static final String s = "final"; 

    public static final Integer i = 3; 


} 

कंसोल:

अंतिम

यह क्या है? मुझे समझ में नहीं आता कि कक्षा क्यों लोड नहीं हुई है, मुझे पता है कि वर्ग हमेशा पहली कॉल पर लोड होते हैं। फ़ील्ड s स्ट्रिंग के पूल में है, मुझे लगता है कि अंतिम संशोधक जादू है।

अगर मैं अंतिम संशोधक (public static String s = "final") को हटा मैं मिल जाएगा

कंसोल:

वर्ग

लोड किया गया है अंतिम

नोट: मैं बदल गया है क्षेत्र i: public static final int i = 3; और इसे कंसो में दिखाएं le। मुझे स्ट्रिंग स्थिति की तरह ही मिला। क्यूं कर?

उत्तर

46

"final"स्ट्रिंग शाब्दिक है और जैसा कि compile-time constant expression है। संकलन-समय निरंतर अभिव्यक्ति के साथ प्रारंभ किए गए static final वैरिएबल का मान सीधे कक्षा में हार्डकोड किया गया है जो संदर्भित करता है, और मूल वर्ग में कोई संदर्भ नहीं दिया जाता है। इसलिए मूल वर्ग का प्रारंभ नहीं होता है। केवल बाद की घटना ठीक JLS द्वारा निर्दिष्ट किया जाता:

एक पक्ष बिंदु के रूप में, वर्ग लोड हो रहा है और वर्ग प्रारंभ के बीच भेद कृपया ध्यान दें। क्लास लोडिंग किसी भी समय हो सकती है।

+1

ठीक है, बहुत बहुत धन्यवाद !! Int के बारे में क्या ?? सार्वजनिक स्थिर अंतिम int i = 3; // wont लेखन वर्ग सार्वजनिक स्थिर अंतिम पूर्णांक i = 3 लोड किया गया है; // लेखन वर्ग – idmitriev

+4

लोड किया गया है कृपया संकलन-समय निरंतर अभिव्यक्ति की परिभाषा पढ़ें जिसे मैंने अपने उत्तर में जोड़ा है। 'int' एक आदिम मान है, 'स्ट्रिंग' संदर्भ-टाइप किए गए मान का एकमात्र विशेष मामला है जो निरंतर अभिव्यक्ति में शामिल हो सकता है, और' इंटीगर 'न तो है। –

+0

@marko - क्या आप मुझे बता रहे हैं कि कक्षा ए बिल्कुल लोड नहीं हो रहा है ?? या यह आलसी शुरुआत का मामला है ??? – TheLostMind

3

यह जावा भाषा विशिष्टता {8.3.2.1 कक्षा चर के लिए प्रारंभकर्ता} में लिखा गया है। यह आपके प्रश्न के

एक सूक्ष्मता यहाँ का जवाब देना होगा कि, रन टाइम पर, स्थैतिक चर कि अंतिम होते हैं और कि संकलन समय निरंतर मूल्यों पहले प्रारंभ कर रहे हैं के साथ प्रारंभ हो रहा है। यह इंटरफ़ेस (§9.3.1) में ऐसे फ़ील्ड पर लागू होता है। ये चर "स्थिरांक" हैं जो कभी भी अपने डिफ़ॉल्ट प्रारंभिक मान (§4.12.5), भयानक प्रोग्रामों द्वारा भी नहीं देखा जाएगा। अधिक चर्चा के लिए §12.4.2 और §13.4.9 देखें।

+0

ऐसा लगता है कि आप इसका जिक्र कर रहे हैं * जावा भाषा विशिष्टता, तीसरा संस्करण *। * जावा® भाषा विशिष्टता जावा एसई 7 संस्करण * में ऐसा कोई पैराग्राफ नहीं है। – johnchen902

+0

हां। यह सही है। मैं पुराने संस्करण की तलाश में था लेकिन बयान जेएलएस 7 के लिए भी अच्छा है। नीचे पंक्तियां जेएलएस 7 रन-टाइम पर स्थिर स्थिर फ़ील्ड हैं और स्थिर अभिव्यक्तियों (§15.28) के साथ आरंभ की गई हैं (पहले §12.4.2)। यह इंटरफेस (§9.3.1) में जैसे फ़ील्ड पर भी लागू होता है। ये फ़ील्ड "स्थिरांक" हैं जिन्हें पर कभी भी नहीं देखा जाएगा, उनके डिफ़ॉल्ट प्रारंभिक मान (§4.12.5), भयानक प्रोग्राम (§13.4.9) द्वारा भी। –

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