2011-11-14 18 views
5

जावा में कहां है, तो आप अपनी घोषणा में एक सरणी के आकार राज्य नहीं कर सकते"अशक्त" स्मृति

int[5] scores; //bad 

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

+0

'0' ... जैसा कि .... शून्य (कुछ भी नहीं, nada, zippo) –

+0

आपने खराब दिन पर हैरी फ्लगलेमैन को मारा। – tenfour

उत्तर

3

नहीं, वह के लिए कोई आवश्यकता नहीं है क्योंकि JVM में (लिंक में जवाब वोट दें करने के लिए अगर यह तुम बाहर में मदद करता है याद)। यदि आप मूल भाषा में हैं (उदाहरण के लिए सी और सी ++), एनयूएलएल शून्य मान वाला पॉइंटर है, और यह मेमोरी बेस एड्रेस को इंगित करता है। जाहिर है कि यह एक वैध पता नहीं है, लेकिन आप वैसे भी इसे "अस्वीकार कर सकते हैं - विशेष रूप से संरक्षित स्मृति के बिना सिस्टम में, पुराने एमएस-डॉस या एम्बेडेड प्रोसेसर के लिए छोटे जैसे। यह नहीं कि यह एक वैध पता होगा - आम तौर पर उस स्थान में इंटरप्ट वैक्टर होते हैं और आपको उन्हें छूना नहीं चाहिए। और निश्चित रूप से किसी भी आधुनिक ओएस में जो सुरक्षा गलती उठाएगा।

लेकिन जेवीएम में किसी ऑब्जेक्ट का संदर्भ एक हैंडल (यानी तालिका में एक अनुक्रमणिका) की तरह है और शून्य एक 'असंभव' मान (तालिका के डोमेन के बाहर एक अनुक्रमणिका है) है, इसलिए यह कर सकता है संदर्भित नहीं किया जाएगा और ऐसी तालिका में जगह पर कब्जा नहीं करता है।

+0

ठीक है, तो वैल्यू नल बस स्टैक पर परिवर्तनीय में आयोजित किया जाता है? – Adam

+0

हां। JVM जांच करेगा कि कब (और यदि) इसे संदर्भित किया गया है, और अगर यह शून्य है तो अपवाद उठाएं। –

+0

इस संबंधित प्रश्न पर भी नज़र डालें, इसका एक बहुत ही विस्तृत उत्तर है: http://stackoverflow.com/questions/2707322/what-is-null-in-java –

1

नहीं ... आपके पास ऑब्जेक्ट के चर में एक शून्य (0x00) संदर्भ होगा।

3

एक शून्य संदर्भ सचमुच शून्य-मूल्य है। ऑपरेटिंग सिस्टम किसी भी प्रोग्राम को स्मृति में शून्य पते तक पहुंचने से रोकता है, इसलिए JVM सक्रिय रूप से जांच करेगा और सुनिश्चित करेगा कि संदर्भ मान आपको शून्य तक पहुंचने से पहले शून्य नहीं है। इससे JVM आपको "एक अवैध ऑपरेशन" क्रैश के बजाए एक अच्छा NullPointerException देता है।

तो आप कह सकते हैं कि चर "एक बिंदु" को अमान्य ढेर स्थान पर ले जाता है। या आप कह सकते हैं कि वेरिएबल कुछ भी "इंगित नहीं करता" है। उस समय यह अर्थशास्त्र का सिर्फ एक प्रश्न है।

+1

NullPointerException। – EJP

+0

@EJP: विधिवत नोट किया गया। – StriplingWarrior

+0

यह ओएस विशिष्ट है कि 0 मान्य स्मृति पता है या नहीं। –

2

मुझे लगता है कि इस पोस्ट आपके प्रश्न का उत्तर होगा - Java - Does null variable require space in memory

जावा में, अशक्त सिर्फ एक मूल्य के लिए एक संदर्भ (जो मूल रूप से एक प्रतिबंधित सूचक है) कर सकते हैं। इसका मतलब है कि संदर्भ कुछ भी नहीं है। इस मामले में आप अभी भी संदर्भ के लिए जगह का उपभोग करते हैं। यह 64-बिट सिस्टम पर 32-बिट सिस्टम या 8 बाइट्स पर 4 बाइट्स है। हालांकि, आप कक्षा के लिए किसी भी स्थान का उपभोग नहीं कर रहे हैं कि संदर्भ बिंदु तब तक जब तक आप उस संदर्भ को इंगित करने के लिए कक्षा का उदाहरण आवंटित नहीं करते हैं।

संपादित करें: जहाँ तक स्ट्रिंग के रूप में, जावा में एक स्ट्रिंग 16 बिट (2 बाइट्स) हर किरदार के लिए , प्लस किताब रखने भूमि के ऊपर, जो शायद undocumented है और इसे लागू विशिष्ट की एक छोटी राशि लेता है।

0

मैं तर्क दूंगा कि "int [5] स्कोर; // खराब" स्मृति आवंटन के कारण नहीं है। ध्यान दें कि जब आप कुछ घोषित करते हैं तो आप वास्तव में घोषित कर रहे हैं संदर्भ नाम = नया प्रकार() आमतौर पर।

दो उदाहरणों का निरीक्षण करें int [] स्कोर = नया int [5]; जेएलएबल लेबल = नया जेएलएबल();

प्रकार (बाएं हाथ की तरफ) int [] और जेलाबेल हैं, जिनके पास स्मृति आवंटन (सूचक के अलावा) के साथ कुछ लेना देना नहीं है, जबकि नए उदाहरण (दाईं ओर, स्मृति आवंटन की आवश्यकता है) हैं int [5], 5 इंट्स और जेएलएबल() के लिए स्पेस की आवश्यकता होती है, जिसमें कन्स्ट्रक्टर को कॉल करने के लिए कोई तर्क की आवश्यकता नहीं होती है, लेकिन जेएलएबल के लिए पर्याप्त मेमोरी होती है।

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