2013-07-17 7 views
9

कोई बता सकता है कि कक्षा लोडिंग और कक्षा को तत्काल करने के बीच क्या अंतर है। जब हम स्टेटिक वैरिएबल के साथ एक वर्ग लोड करते हैं तो क्या कक्षा को लोड होने के साथ ही यह तुरंत चालू हो जाता है? सभी स्थैतिक कोड कक्षा के हिस्से के बजाय व्यक्तिगत उदाहरणों के बाद। यह उपयोगी होगा अगर किसी ने मुझे बेहतर समझने में मदद करने के लिए एक उदाहरण दिया।कक्षा को लोड करने और इसे तुरंत चालू करने के बीच अंतर

+0

एक वैकल्पिक StackExchange साइट हो सकता है [इस उत्तर] (http://programmers.stackexchange.com/questions/53181/what-is-the-difference-between-instantiating- और लोडिंग-एक श्रेणी में जावा)। यह बहुत व्यापक है। – NINCOMPOOP

+5

@TheNewIdiot मुझे नहीं लगता कि सवाल व्यापक है क्योंकि इसमें एक बहुत ही विशिष्ट दायरा है और एक विशिष्ट उत्तर भी है। –

+0

एसओ भी ** विस्तृत ** परिभाषित करता है * इस प्रारूप के लिए अच्छे उत्तर बहुत लंबे होंगे। * !!! – NINCOMPOOP

उत्तर

9

यहाँ कुछ अच्छा विवरण (एक उदाहरण और अवलोकन के साथ) है

When a class is loaded and initialized in JVM - Java

जब कक्षा जावा में भरी हुई है

कक्षा लोड हो रहा है जावा में ClassLoaders को लागू किया जा सकता है जिसके द्वारा किया जाता है कक्षा शुरू होने की आवश्यकता होने तक कक्षा में उत्सुकता से एक वर्ग को संदर्भित करें या कक्षा में आलसी लोड करें। यदि क्लास को वास्तव में इस्तेमाल होने से पहले लोड किया जाता है तो यह प्रारंभ होने से पहले अंदर बैठ सकता है। मेरा मानना ​​है कि यह जेवीएम से जेवीएम में भिन्न हो सकता है। हालांकि जेएलएस द्वारा इसकी गारंटी है कि स्थिर प्रारंभिक आवश्यकता होने पर कक्षा को लोड किया जाएगा।

जब एक कक्षा जावा

में आरंभ नहीं हो जाता जब एक कक्षा जावा में आरंभ नहीं हो जाता वर्ग लोड हो रहा है के बाद, वर्ग के प्रारंभ जगह वर्ग के सभी स्थिर सदस्यों आरंभ जिसका अर्थ है लेता है। A वर्ग जावा में प्रारंभ हो जाती है:

1) वर्ग का एक उदाहरण class.forName() है, जो जावा में ClassNotFoundException फेंक कर सकते हैं का उपयोग कर प्रतिबिंब का उपयोग कर या तो नए() कीवर्ड या उपयोग कर बनाई गई है।

2) कक्षा की एक स्थिर विधि लागू की जाती है।

3) कक्षा का एक स्थिर क्षेत्र असाइन किया गया है।

4) कक्षा का एक स्थिर क्षेत्र उपयोग किया जाता है जो स्थिर चर नहीं है।

5) यदि कक्षा शीर्ष स्तर की कक्षा है और वर्ग के भीतर अक्षय रूप से घोंसला वाला कथन निष्पादित किया गया है।

आशा है कि मदद करता है।

+0

मैं थोड़ा उलझन में हूं और आपके साथ कुछ स्पष्टीकरण देना चाहता हूं। आलसी लोडिंग से हमारा मतलब है कि जब भी क्लासलोडर वर्तमान कक्षा के अंदर एक कक्षा घोषणा देखता है, तब भी यह दूसरी कक्षा को लोड नहीं करता है क्योंकि इसे अभी तक शुरू नहीं किया गया है और उत्सुक लोडिंग क्लासलोडर प्रत्येक कक्षा को लोड करता है, चाहे वह कोई फर्क नहीं पड़ता कि यह प्रारंभिक है या नहीं और यह भी समझा सकता है कि आलसी और उत्सुक क्लासलोडर दोनों रिकर्सिव कॉल कैसे करते हैं (वे अन्य वर्गों को लोड करते हैं)। – light

3

कक्षा लोड हो रहा है
जब भी JVM यह एक वर्ग (अपने स्थैतिक चर का उपयोग करने के लिए, एक नई वस्तु बनाने के लिए, अपने स्थिर विधियों का उपयोग करने आदि) यह वर्ग और स्थिर initialisation ब्लॉक चलेंगे लोड होगा की जरूरत है निर्धारित करता है, स्थैतिक चर प्रारंभिक आदि हैंयह (एक उदाहरण के रूप में) एक परिणाम के निम्नलिखित रन के रूप में केवल एक बार

SomeClass.someStaticMethod(); //SomeClass is loaded (if its not already) 
SomeClass.someStaticVariable; //SomeClass is loaded (if its not already) 
SomeClass var=new SomeClass(); //SomeClass is BOTH loaded (if its not already) AND instantiated 

किया है (कम से कम सामान्य परिस्थितियों में):

static Vector3d var=new Vector3d(); //static variables are initialised 

static{ 
    //static initialisation block are run 
} 

एक वर्ग
instantiating दूसरी ओर जब आप new कीवर्ड के साथ कक्षा का उदाहरण बनाते हैं तो instantiate a class दबाएं; कक्षा को तत्काल बनाना कक्षा का एक वस्तु बना रहा है।

SomeClass var=new SomeClass(); //SomeClass is instantiating (and loaded if its not already) 

नतीजतन निर्माता रन:

public SomeClass(){ 
} 

और

{ 
    //initialisation block(s) also run (but these are very uncommonly used) 
} 
6
Integer.toString(123); 

ऊपर स्थिर विधि कॉल काम करने के लिए, पूर्णांक वर्ग लोड किया जाना चाहिए।

Integer i = new Integer(123); 
पूर्णांक वर्ग के

और उपरोक्त कोड में, मैं एक उदाहरण (वस्तु) बना लिया है (जो भी इस काम करने के लिए लोड किया जाना चाहिए, स्पष्ट रूप से)।

कुछ वर्गों को तत्काल नहीं माना जाता है (उदाहरण के लिए, गणित वर्ग, उदाहरण के लिए, जिसमें केवल स्थिर विधियां हैं)।

+0

+1 यह सबसे छोटा लेकिन सबसे अच्छा जवाब है, उदाहरण का सही उपयोग, यह वह जगह है जहां अनुभव तस्वीर में आता है! लिंक पोस्ट किए बिना व्यापक स्पष्टीकरण के लिए – NINCOMPOOP

2

संदर्भित होने पर एक वर्ग लोड होता है (उदा। Class.forName() द्वारा)।

आप एक उदाहरण बनाकर किसी ऑब्जेक्ट को instanciate, उदा।

Object o = new Object(); 

आप प्रतिबिंब का उपयोग कर किसी ऑब्जेक्ट को भी इंस्टेंट कर सकते हैं।

static कक्षा के सदस्यों को कक्षा लोड होने पर तत्काल किया जाता है, उदा।

public class Sample { 
    private static int variable = 10; 
} 

जब मैं अब वर्ग (Class.forName("Sample"); द्वारा उदा) लोड तब चर variable मूल्य 10 साथ आरंभ नहीं हो जाता।

यदि आप कक्षा का एक नया उदाहरण बना रहे हैं और कक्षा से पहले लोड होने से पहले इसे लोड नहीं किया जाएगा (atomatically)। तो निर्माण Class.forName() केवल विशेष परिस्थितियों में आवश्यक है (यदि वर्ग संकलित समय के अनुसार ज्ञात नहीं है)।

+0

+1। – NINCOMPOOP

+1

@TheNewIdiot लिंक को बुरी चीज पोस्ट कर रहा है? निश्चित रूप से एक उत्तर "बिना लाइव" लिंक करने में सक्षम होना चाहिए, लेकिन एक संदर्भ –

+0

@RichardTingle क्षमा करने के लिए विश्वसनीयता को जोड़ता है, लेकिन मैं कहना चाहता हूं ** स्पष्टीकरण के बिना ** केवल लिंक उत्तर ** कहना चाहता हूं। – NINCOMPOOP

3

क्लास लोडर वास्तव में जेवीएम में बाइट कोड लोड करता है, स्थिर प्रारंभिक चलाता है। जब आप कक्षा के भीतर स्थिर फ़ील्ड का उपयोग किए बिना कक्षाओं का उपयोग करना चाहते हैं, तो क्लास लोडर द्वारा पहले लोड किया जाना चाहिए। जावा में डिफॉल्ट क्लासलोडर java.lang.ClassLoader है। लोडिंग केवल एक बार किया जाता है।
जबकि कक्षा तत्काल कक्षा में स्मृति का उदाहरण बना रहा है। हम new का उपयोग कर कक्षा को तुरंत चालू कर सकते हैं। क्लास तत्काल कई बार किया जा सकता है। जैसे: Animal a=new Animal();

More on class loading

+0

के पीछे प्राप्त कर सकता हूं आप कह रहे हैं कि क्लास लोडर स्थिर प्रारंभिक चलाता है और लोडिंग ठीक उसी समय किया जाता है, तब क्या होता है जब वर्ग का एक उदाहरण स्थैतिक चर के मान को बदलता है? –

+0

जब कक्षा लोडर कक्षा के कीवर्ड से मुकाबला करता है तो यह जांच करेगा कि कक्षा पहले ही लोड हो चुकी है या नहीं। क्लास लोड होने पर स्थैतिक चर प्रारंभ हो जाता है, जब आप वर्ग के नए उदाहरण बनाते हैं तो कक्षा द्वारा किए गए परिवर्तन प्रतिबिंबित होंगे। – Rohan

+0

शायद मैं स्पष्ट नहीं हूं। मैं पूछ रहा हूं कि मैंने कक्षा के एक उदाहरण (ऑब्जेक्ट) बनाया है। इस उदाहरण का उपयोग करके मैं स्थैतिक चर के मान को बदलता हूं। यह परिवर्तन लोड वर्ग में कैसे दिखाई देता है? –

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

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