2010-08-17 17 views
97

स्थिर फ़ील्ड कब प्रारंभ किए जाते हैं? यदि मैं कभी भी कक्षा को तुरंत चालू नहीं करता हूं, लेकिन मैं एक स्थिर क्षेत्र तक पहुंचता हूं, तो क्या सभी स्थैतिक ब्लॉक और निजी स्थैतिक विधियां उस तत्काल पर (स्थिर क्रम) नामक निजी स्थैतिक क्षेत्रों को तत्काल करने के लिए उपयोग की जाती हैं?स्थिर वर्ग प्रारंभ कब होता है?

यदि मैं एक स्थिर विधि कहूं तो क्या होगा? क्या यह सभी स्थिर ब्लॉक भी चलाता है? विधि से पहले?

+0

स्थिर प्रारंभकर्ता ब्लॉकों के लिए इसी तरह का उपयोग करके प्रारंभ करने में (यदि वह पहले आरंभ नहीं किया गया है) एक वर्ग के लिए मजबूर भी संभव है: http://stackoverflow.com/questions/ 2007666/इन-ऑर्डर-डू-स्टेटिक-प्रारंभिक-ब्लॉक-इन-जावा-रन –

उत्तर

138

एक वर्ग के स्थिर प्रारंभ सामान्य रूप से पहली बार निम्नलिखित घटनाओं में से एक से पहले तुरंत होता है होते हैं:

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

JLS 12.4.1 देखें।

यह Class.forName(fqn, true, classLoader) या संक्षिप्त रूप Class.forName(fqn)

+0

अतिरिक्त जानकारी के लिए कूल धन्यवाद। जेएलएस संदर्भ –

+5

+1 यह भी ध्यान दें कि छोटे फॉर्म 'class.forName (className)' प्रारंभिकरण को भी बल देते हैं क्योंकि यह 'class.forName (className, true, currentLoader)' के समतुल्य है। – Moshe

+4

देने के लिए – user113215

1

हां, पहली बार कक्षा तक पहुंचने से पहले सभी स्थैतिक प्रारंभकर्ता चलाए जाते हैं। अगर यह कोई अन्य तरीका था, तो मैं इसे एक बग कहूंगा।

+0

कक्षा शुरू करने के बिना किसी वर्ग को संदर्भित करने के तरीके हैं। –

11

स्टेटिक फ़ील्ड को initialization कक्षा लोडिंग (लोडिंग, लिंकिंग और प्रारंभिकरण) के "चरण" के दौरान शुरू किया गया है जिसमें स्थैतिक प्रारंभकर्ता और इसके स्थिर फ़ील्ड के प्रारंभिकरण शामिल हैं। कक्षा में परिभाषित अनुसार स्थिर प्रारंभकर्ताओं को एक पाठ क्रम में निष्पादित किया जाता है।

public class Test { 

    static String sayHello() { 
     return a; 
    } 

    static String b = sayHello(); // a static method is called to assign value to b. 
           // but its a has not been initialized yet. 

    static String a = "hello"; 

    static String c = sayHello(); // assignes "hello" to variable c 

    public static void main(String[] arg) throws Throwable { 
     System.out.println(Test.b); // prints null 
     System.out.println(Test.sayHello()); // prints "hello" 
    } 
} 

Test.b प्रिंट null क्योंकि जब sayHello स्थिर दायरे में बुलाया गया था, स्थिर चर a आरंभ नहीं किया गया था:

उदाहरण पर विचार करें।

+6

कड़ाई से बोलते हुए, प्रारंभिकरण कक्षा लोडिंग का "चरण" नहीं है। दरअसल, कुछ वर्ग * लोड हो सकते हैं लेकिन प्रारंभ नहीं किया गया है यदि एप्लिकेशन वास्तव में उनका उपयोग नहीं करता है। –

+0

@ स्टीफन सी आप सही हैं, मैंने इसे बेहतर अवधि की कमी के लिए उपयोग किया है, शायद मैं इसे उद्धृत करूंगा। – naikus

+0

@StephenC का मतलब क्लास लोडिंग होने पर होता है, यह स्थिर चर (और विधियों) को स्मृति निर्दिष्ट करता है लेकिन कोड में प्रदान किए गए मानों के साथ उन स्थैतिक चर प्रारंभ नहीं किए जाते हैं? क्योंकि यहां ऐसा लगता है जब b-> sayHello() -> ए, 'ए' स्मृति में है लेकिन इसके लिए मूल्य अभी तक असाइन नहीं किया गया है। –

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