यह कक्षा लोडर का काम है।जावा में वर्ग लोडिंग बूटस्ट्रैप क्लासलोडर से शुरू होती है। यह वर्ग लोडर पहले मानक जावा पुस्तकालय, rt.jar में सभी वर्गों को लोड करता है।
फिर एक्सटेंशन क्लासलोडर का आह्वान किया गया है। यह एक JVM ext निर्देशिका में स्थापित एक्सटेंशन जार फ़ाइलों से सभी वर्गों को लोड करता है। अब अंततः कक्षापाथ क्लासलोडर का आह्वान किया जाता है।
क्लासपाथ क्लासलोडर मुख्य वर्ग से कक्षाओं को लोड करना शुरू कर देता है, जिस वर्ग में मुख्य विधि परिभाषित की गई है। एक बार लोड होने के बाद, यह उस कक्षा में स्थैतिक आरंभकर्ता निष्पादित करता है। प्रारंभकर्ता के निष्पादन में, यदि यह किसी भी वर्ग को लोड नहीं करता है जो लोड नहीं होता है, तो यह स्थिर ब्लॉक के निष्पादन को रोक देगा, पहले कक्षा को लोड करेगा, और आखिरकार उस स्थिर ब्लॉक के निष्पादन को फिर से शुरू करेगा।
तो, ऐसा कोई मौका नहीं है कि गैर-लोड कक्षाओं के लिए कोई भी कॉल हो। चलो अपने स्वयं के उदाहरण है, जिसका कोड इस तरह है के साथ इस देखें:
class A
{
public final static List<Integer> list;
static
{
System.out.println("Loaded Class A");
list = new ArrayList<>();
}
}
class B
{
public final static int dependsOnA;
static
{
System.out.println("Loaded Class B");
dependsOnA = A.list.size();
}
}
यहां इस उदाहरण में, वहाँ वास्तव में कोई मुख्य विधि है, इसलिए इन कक्षाओं में वास्तव में मेमोरी में लोड नहीं किया जाएगा। मान लीजिए, चलिए उपरोक्त कोड में निम्नलिखित मुख्य श्रेणी जोड़ें।
class C
{
static
{
System.out.println("Loaded Class C");
}
public static void main(String[] args)
{
System.out.println(B.dependsOnA);
}
}
देखते हैं क्या इस उत्पादन में उत्पादन होता है: http://ideone.com/pLg3Uh
Loaded Class C
Loaded Class B
Loaded Class A
0
है, प्रथम श्रेणी सी भरी हुई है, क्योंकि यह मुख्य विधि था। एक बार लोड होने के बाद, कक्षा सी के स्थिर प्रारंभकर्ता को बुलाया जाता है। हालांकि, ध्यान दें कि कक्षा सी के स्थिर ब्लॉक के बाद मुख्य विधि लागू की जाती है।
अब मुख्य विधि, हम वर्ग बी के dependsOnA
का मूल्य अब मुद्रित, वर्ग लोडर कि बयान को क्रियान्वित बंद हो जाता है, और वर्ग बी लोड करता है, और यह स्थिर ब्लॉक, जो बारी में, के साथ प्रदान करती है dependsOnA
चर है कार्यान्वित कक्षा ए की सूची में तत्वों की संख्या का मूल्य, जो लोड नहीं होता है।
तो कक्षा लोडर वहां से कूदता है, अब कक्षा को लोड करता है, और कक्षा ए के स्थिर ब्लॉक को आमंत्रित करता है, और एक सूची बनाई जाती है। अब चूंकि लोड करने के लिए और कक्षाएं नहीं हैं, इसलिए कक्षा लोडर कक्षा बी के स्थिर ब्लॉक पर वापस आता है, और असाइनमेंट पूरा हो गया है। अब अंत में, नियंत्रण मुख्य विधि के साथ है, और dependsOnA
का मान कंसोल पर मुद्रित है।
उम्मीद है कि इससे मदद मिलती है।
* डिज़ाइन * पॉइंट-ऑफ-व्यू से, मैं सौहार्दपूर्ण सुझाव देता हूं कि कक्षा 'ए' के लिए सार्वजनिक * इसकी' सूची 'संपत्ति बनाने के लिए यह एक अच्छा विचार नहीं है। इसके बजाय, मैं इसे निजी बना देता, और 'ए' में * विधियों * प्रदान करता था जो अन्य सभी वर्गों को "उन चीजों को जो उन्हें जानने की ज़रूरत होती है, और उन चीजों को करने की क्षमता देता है जिन्हें उन्हें करने की आवश्यकता होती है।" एक बहुत ही महत्वपूर्ण लाभ यह है कि, अब, कक्षा 'ए' दोनों आत्मनिर्भर और आत्म-वर्णन दोनों हैं। यह सुनिश्चित करने के लिए आवश्यक सभी कोड कि वर्ग 'ए' सही तरीके से काम कर रहा है, * * वर्ग 'ए' में है, जिसका कोड हस्तक्षेप या साइड इफेक्ट्स (जैसे 'बी') से संरक्षित है। –
... भी: "ए 'क्या कर सकता है, और अन्य लोग' ए' 'के साथ क्या कर सकते हैं? * प्रश्न * केवल * ए * पर देखकर, इस प्रश्न का उत्तर अब निश्चित रूप से दिया जा सकता है। दोनों के बीच रनटाइम अंतर नगण्य है, लेकिन डिजाइन, आईएमएचओ, अधिक मजबूत और डिबगबल है। (और, बहुत कम निर्भर करता है "बिल्कुल जब जावा यह करता है या वह।") मैं प्रस्तुत करता हूं कि यह कहना एक अच्छा सिद्धांत है: "अन्य वर्गों को अन्य वर्गों के मामलों में दखल न दें।" जितना अधिक यह इंसानों के लिए बुद्धिमान है ("जो कुरकुरे हैं, और फवा बीन्स के साथ अच्छा स्वाद ...") ड्रैगन के साथ दखल देने के लिए नहीं। –
यदि सूची पहले से ही स्थिर है तो Alist.size() प्रत्यक्ष पहुंच अधिक कुशल हो सकती है? –