2013-02-25 46 views
9

मैंने खोज इंजन के माध्यम से इस प्रश्न की खोज करने की कोशिश की लेकिन एक ऐसा विषय मिल सकता है जिसने कक्षा को शुरू करने और किसी ऑब्जेक्ट को तत्काल करने के बीच अंतर को समझाया।कक्षा शुरू करने और किसी ऑब्जेक्ट को तुरंत चालू करने के बीच अंतर?

कोई बता सकता है कि वे कैसे भिन्न होते हैं?

+5

कक्षा शुरू करने जैसी कोई चीज नहीं है। क्या आपका मतलब एक चर शुरू करना है? – Femaref

+0

क्या आपका मतलब है ** ऑब्जेक्ट प्रारंभ करना ** ?? – PermGenError

+0

@ फेमेरेफ़, शायद यह शब्द तकनीकी नहीं है, लेकिन मुझे लगता है कि क्रमशः कक्षा और एक उदाहरण शुरू करने के रूप में स्थिर प्रारंभकर्ताओं और रचनाकारों का वर्णन करना उचित है। –

उत्तर

1

जब जावा क्लास को JVM में "लोड" किया जाता है तो कक्षा का प्रतिनिधित्व कई तरीकों से शुरू किया जाना चाहिए।

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

क्लास प्रारंभिकरण को संदर्भित करने के लिए उपयोग की जाने वाली शब्दावली का एक विशिष्ट सेट है, हालांकि मुझे विशिष्टताओं को याद नहीं है। कुछ चीजें केवल एक विशिष्ट बिंदु, आदि के लिए कक्षा शुरू करने के बाद ही हो सकती हैं।

किसी ऑब्जेक्ट को इंस्टेंट करना केवल वर्ग लोड होने और प्रारंभ होने के बाद ही हो सकता है (हालांकि सभी विधियों को सत्यापित करने की आवश्यकता नहीं है)। वस्तु का आकार कक्षा से प्राप्त हुआ है और वह ढेर स्थित है और शून्य है। ऑब्जेक्ट हेडर क्लास के पॉइंटर और क्लास को प्रबंधित करने के लिए उपयोग किए जाने वाले अन्य फ़ील्ड में भर जाता है। फिर कक्षा के लिए उचित कन्स्ट्रक्टर विधि लागू की जाती है (और यह किसी भी सुपर के निर्माता को बुलाएगी)।

0

कक्षा प्रारंभ करना एक स्थिर प्रारंभिक ब्लॉक का उपयोग करके किया जाता है। (स्थिर {})। यह एक विधि नहीं है, यह एक प्रारंभकर्ता है। इसे पहली बार कक्षा में संदर्भित किया जाता है जब इसे संदर्भित किया जाता है।

किसी ऑब्जेक्ट को इंस्टेंट करना उदाहरण के लिए अपने कन्स्ट्रक्टर को कॉल करके नए कीवर्ड के साथ किया जाता है। उस समय स्थिर प्रारंभिक ब्लॉक निष्पादित नहीं किया जाएगा।

14

इस विषय से जुड़े शब्दावली के तीन टुकड़े हैं: घोषणा, प्रारंभिकरण और तत्कालता।

पीछे से आगे काम करना।

आरंभ होने

यह जब स्मृति एक वस्तु के लिए आवंटित किया गया है। यह new कीवर्ड कर रहा है। बनाए गए ऑब्जेक्ट का संदर्भ new कीवर्ड से वापस कर दिया गया है।

प्रारंभ

यह वह जगह है जब मान स्मृति कि आवंटित किया गया था में डाल दिया जाता है। यह new कीवर्ड का उपयोग करते समय कक्षा के Constructor है।

एक चर को भी स्मृति में कुछ वस्तु के संदर्भ में प्रारंभ करके प्रारंभ किया जाना चाहिए।

घोषणा

यह वह जगह है जब आप प्रोग्राम है कि वहाँ एक निश्चित प्रकार मौजूदा और क्या उस वस्तु का नाम होगा की एक वस्तु हो जाएगा करने के लिए राज्य। एक ही पंक्ति स्मृति

void someFunction(SomeClass other) { 
    SomeClass s; // Declaration 
    s = other; // Initializes the variable 's' but memory for variable other was set somewhere else 
} 

के लिए एक अलग लाइन पर एक चर के प्रारंभ की

SomeClass s; // Declaration 
s = new SomeClass(); // Instantiates and initializes the memory and initializes the variable 's' 

उदाहरण मैं भी अत्यधिक this article पढ़ने की सिफारिश करेंगे पर प्रारंभ और आरंभ होने की

उदाहरण जावा कैसे चर से गुजरता है की प्रकृति पर।

+1

क्या आप एक उदाहरण दे सकते हैं जहां एक ही समय में प्रारंभिकरण और तत्कालता _not_ होती है? – Leo

+0

@ लियो मैंने पोस्ट अपडेट किया ... अगर मुझे मदद मिली तो मुझे बताएं! – lachy

+0

जहां ** "**" ** तत्काल हो रहा है (कब क्या इसकी स्मृति आवंटित हो जाती है)? –