2013-02-06 16 views
5

हाय स्टैक ओवरफ्लो सदस्यों, यहां "क्लास लोडिंग समय" के वास्तविक अर्थ से संबंधित एक छोटा सा प्रश्न है।जावा में क्लास लोडिंग समय

उदाहरण के लिए निम्नलिखित कोड:

public class Sequence { 
    Sequence() { 
     System.out.print("c "); 
    } 
    { 
     System.out.print("y "); 
    } 
    public static void main(String[] args) { 
     System.out.println("Indeed"); 
     new Sequence().go(); 
    } 
    void go() { 
     System.out.print("g "); 
    } 
    static { System.out.println("x "); } 
} 

यह पहली बार बाहर प्रिंट करता है "x" जो स्थिर है, इसलिए स्थैतिक init ब्लॉक हमेशा "वर्ग लोडिंग समय" पर लोड किए गए हैं। मुझे यह मिलता है, लेकिन क्या आप जानते हैं कि यह लोडिंग समय कब होता है? मैंने सोचा था कि जब पहली वस्तु को पहली वस्तु बनाकर मुख्य विधि में बुलाया जाता है लेकिन उस स्थिति में परिणाम पहले "वास्तव में" प्रिंट करके अलग होना चाहिए था। कोई भी इस संदेह को स्पष्ट करने में मेरी मदद कर सकता है? मैंने सामान्य रूप से इस तर्क के बारे में बात करते हुए अन्य पोस्ट की जांच की है, लेकिन फिर भी मुझे लगता है कि ऊपर बताए गए कोड में, वास्तव में, "कक्षा लोडिंग समय" होता है, यह जानने के लिए बहुत स्पष्ट होगा (कम से कम मेरे लिए)।

अग्रिम धन्यवाद।

+0

फिर से स्पष्ट होने के लिए, मुझे इस छोटे कार्यक्रम के आउटपुट पता है और मुझे पता है कि यह इस आउटपुट को क्यों देता है। हालांकि मैं जानना चाहता हूं कि वास्तव में "वर्ग लोडिंग समय" कब होता है। – Rollerball

+1

'जब भी आपकी कक्षा JVM में लोड हो जाती है, तो मैं जानना चाहूंगा कि "वर्ग लोडिंग समय" वास्तव में कब होता है। :) – PermGenError

+0

मुझे लगता है कि आपको क्लास नॉटफाउंड अपवाद – duffy356

उत्तर

3

अपने प्रश्न का उत्तर JLS Chapter 12.4.1 When Initialization Occurs

एक वर्ग या इंटरफ़ेस प्रकार T में है निम्नलिखित में से किसी एक का पहली घटना से ठीक पहले प्रारंभ किया जाएगा:

  • T एक है कक्षा और T का एक उदाहरण बनाया गया है।
  • T एक कक्षा है और T द्वारा घोषित एक स्थैतिक विधि का आह्वान किया जाता है।
  • T द्वारा घोषित एक स्थिर क्षेत्र असाइन किया गया है।
  • T द्वारा घोषित एक स्थिर क्षेत्र का उपयोग किया जाता है और फ़ील्ड स्थिर चर नहीं है (§4.12.4)।
  • T एक शीर्ष स्तरीय वर्ग (§7.6) है, और T (§8.1.3) के भीतर अक्षय रूप से घोंसला वाला एक कथन कथन (§14.10) निष्पादित किया गया है।

मेरा सुझाव है कि आप ऊपर में JLS Chapter 12.4. Initialization of Classes and Interfaces

बस Chapter 12. Execution के साथ शुरू कुछ लाइनें पढ़ना शुरू, यह वास्तव में वर्णन करता है जब एक वर्ग लोड करने के लिए की जरूरत है। इसे लोड करने के बाद प्रारंभ किया जाएगा।

3

अपने main विधि के रूप में में वर्ग Sequence, पहले JVM द्वारा लोड करने की आवश्यकता है कि स्थित है। तो यह सही समझ में आता है कि "x" मुद्रित होने वाली पहली चीज़ है।

3

आप सही हैं, क्लास लोड होने पर स्थिर ब्लॉक run हैं। और जब आप प्रोग्राम चलाते हैं तो यह आपके मामले में होता है। क्योंकि मुख्य विधि स्वयं कक्षा Sequence के अंदर है, इसलिए आउटपुट xIndeed से पहले आ रहा है सही है।

1

वर्ग Sequence से पहले main विधि JVM, जो जगह है और इसलिए क्यों x है पहली बात बाहर मुद्रित करने के लिए लेने के लिए स्थिर initialialization का कारण बनता है द्वारा शुरू हो जाती है लोड करने के लिए है।

2

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

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