2011-12-18 19 views
13

ऐसा कहा जाता है कि जावा में स्थिर ब्लॉक केवल उस वर्ग को चलाते हैं जब उस वर्ग को लोड किया जाता है। लेकिन इसका वास्तव में क्या अर्थ है? जेवीएम (जावा वर्चुअल मशीन) द्वारा लोड की गई कक्षा किस बिंदु पर है?"जब कक्षा को लोड किया जाता है" वास्तव में क्या होता है?

क्या यह उस वर्ग में मुख्य विधि कहलाता है? और क्या यह है कि मुख्य विधि निष्पादन शुरू होने पर उसी वर्ग के सभी सुपर-वर्ग भी लोड किए जाते हैं?

ध्यान दें कि ए बी बढ़ाता है और सी विस्तारित करता है। सभी में स्थिर ब्लॉक हैं। यदि ए में मुख्य विधि है, तो स्थिर ब्लॉक के निष्पादन का अनुक्रम क्या होगा?

उत्तर

9

यह जेएलएस के Execution खंड में वर्णित है। अर्थात्:

कक्षा के आरंभ में कक्षा में घोषित स्थैतिक क्षेत्रों के लिए अपने स्थिर प्रारंभकर्ताओं और प्रारंभिककर्ताओं को निष्पादित करने के होते हैं। इंटरफ़ेस में प्रारंभ किए गए फ़ील्ड के लिए प्रारंभकर्ताओं को प्रारंभ करने के लिए एक इंटरफ़ेस के प्रारंभ में शामिल होते हैं।
कक्षा शुरू होने से पहले, इसका प्रत्यक्ष सुपरक्लास प्रारंभ किया जाना चाहिए, लेकिन कक्षा द्वारा कार्यान्वित इंटरफेस को प्रारंभ नहीं किया जाना चाहिए। इसी प्रकार, इंटरफ़ेस प्रारंभ होने से पहले इंटरफ़ेस के सुपरइंटरफेस को प्रारंभ नहीं किया जाना चाहिए।

तो अपने उदाहरण में, "सर्वोच्च" वर्ग (C) के स्थिर ब्लॉक पहले सबसे व्युत्पन्न एक चलाता B की है कि तब, है, तो।

कक्षा को लोड करने में जाने वाले सभी चरणों के विस्तृत विवरण के लिए उस दस्तावेज़ को देखें।

(। क्लासेस लोड हो जब वे पहली बार सक्रिय रूप से उपयोग किया जाता है)

1

Java Language Specification से:

एक वर्ग के प्रारंभ स्थिर क्षेत्र (वर्ग चर) के लिए अपने स्थिर initializers और initializers को क्रियान्वित करने के होते हैं कक्षा में घोषित एक इंटरफ़ेस के प्रारंभ में फ़ील्ड (स्थिरांक) के लिए प्रारंभिककर्ताओं को निष्पादित करने का समावेश होता है।

कक्षा शुरू होने से पहले, इसके सुपरक्लास को प्रारंभ किया जाना चाहिए, लेकिन कक्षा द्वारा लागू इंटरफेस प्रारंभ नहीं किए गए हैं। इसी प्रकार, इंटरफ़ेस प्रारंभ होने से पहले इंटरफ़ेस के सुपरइंटरफेस प्रारंभ नहीं किए जाते हैं।

प्रक्रिया Java Virtual Machine Specification में अधिक विस्तार से वर्णित है।

1

मुझे लगता है कि निम्न उदाहरण अपनी समस्याओं के सभी का समाधान होगा:

से पहले एक वर्ग आरंभ नहीं हो जाता, उसके सुपर-क्लास, प्रारंभ कर रहे हैं अगर वे पहले से प्रारंभ नहीं किया गया है।

इस प्रकार, परीक्षण कार्यक्रम:

class Super { 
     static { System.out.print("Super "); } 
} 
class One { 
     static { System.out.print("One "); } 
} 
class Two extends Super { 
     static { System.out.print("Two "); } 
} 
class Test { 
     public static void main(String[] args) { 
       One o = null; 
       Two t = new Two(); 
       System.out.println((Object)o == (Object)t); 
     } 
} 

प्रिंट:

Super Two false 

वर्ग एक प्रारंभ कभी नहीं है, क्योंकि यह सक्रिय रूप से उपयोग नहीं किया है और इसलिए से जुड़ा हुआ कभी नहीं किया गया है।कक्षा दो को इसके सुपरक्लस सुपर शुरू होने के बाद ही शुरू किया गया है। निकाला गया भ्रामक लाइनों:

अधिक जानकारी के लिए इस link

विवरण संपादित करें पर जाएँ।

+0

'जेवीएम शुरू होने के ठीक बाद' इस प्रक्रिया का सटीक विवरण नहीं है। अन्य उत्तरों देखें। Downvote। – EJP

+0

उन भ्रमित लाइनों को हटा दिया –

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

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