2010-11-10 6 views
18

मेरे पास यह कोड है:गैर-प्रारंभिकरण के बीच क्या अंतर है और शून्य में प्रारंभ करना है?

MyClass object; 

.... some code here where object may or may not be initialised... 

if (object.getId > 0) { 
    .... 
} 

जिसके परिणामस्वरूप संकलन त्रुटि होती है: object प्रारंभ नहीं किया जा सकता है, जो पर्याप्त है।

अब मैं अपना कोड इस पर बदलता हूं:

MyClass object; 

.... some conditional code here where object may or may not be initialised... 

if (object != null && object.getId > 0) { 
    .... 
} 

मुझे एक ही संकलन त्रुटि मिलती है! मुझे object को शून्य में प्रारंभ करना है:

MyClass object = null; 

तो किसी ऑब्जेक्ट को प्रारंभ करने और शून्य करने के बीच प्रारंभ करने के बीच क्या अंतर है? अगर मैं बिना किसी प्रारंभ के ऑब्जेक्ट घोषित करता हूं तो क्या यह वैसे भी शून्य नहीं है?

धन्यवाद

उत्तर

27
  • क्षेत्र (सदस्य-चर) null के लिए शुरू कर रहे हैं (या एक डिफ़ॉल्ट आदिम मूल्य के लिए, अगर वे पुरातन कर रहे हैं)
  • स्थानीय चर आरंभ नहीं कर रहे हैं और आप प्रारंभिक स्थापित करने के लिए जिम्मेदार हैं मूल्य।
+0

कि हालांकि मेरे सवाल है: "अशक्त" एक मूल्य है? मैं हमेशा इसे (शायद बेवकूफ) मानता हूं "कोई मूल्य नहीं", इसलिए गैर-प्रारंभिकता के बराबर। –

+1

उस बारे में पता नहीं था। अब मैंने आज भी कुछ नया सीखा है :) – Nailuj

+5

@ रिचर्ड: शून्य निश्चित रूप से एक मूल्य है। यह वह मान है जो किसी ऑब्जेक्ट को संदर्भित नहीं करता है। "निश्चित रूप से असाइन नहीं किया गया" और "निश्चित रूप से असाइन किया गया है, शून्य के मूल्य के साथ" के बीच एक अंतर है। –

3

यह एक भाषा परिभाषा बात है।

कि विधि-दायरे से चर MUST मैन्युअल प्रारंभ भाषा राज्यों - अगर आप उन्हें शून्य के रूप में शुरू करना चाहते हैं, तो आप स्पष्ट रूप से ऐसा कहना होगा - यदि आप ऐसा करने में विफल रहते हैं, वे एक में मूल रूप से कर रहे हैं अपरिभाषित राज्य

असल में, भाषा बताती है कि क्लास-स्कोप के चर को मैन्युअल रूप से प्रारंभ करने की आवश्यकता नहीं है - उन्हें प्रारंभ करने में विफलता स्वचालित रूप से न्यूल में प्रारंभ हो रही है - इसलिए आपको इसके बारे में चिंता करने की आवश्यकता नहीं है।

जहां तक ​​दोनों राज्यों (शून्य बनाम अपरिभाषित) के बीच का अंतर है, हां वे मूल रूप से वही हैं - लेकिन भाषा यह निर्देश देती है कि आपको एक चर प्रारंभ करने की आवश्यकता है (चाहे वह आपके लिए स्वचालित रूप से हो या नहीं, निर्भर करता है चर के दायरे पर)।

+1

तो, यह है -> http: // goo।gl/Dhtebe केवल आंशिक रूप से सच है? – Sotti

+1

@ सोटी जो आपके द्वारा प्रदान किया गया संदर्भ विशेष रूप से क्लास-स्कोप्ड विधियों के बारे में बात कर रहा है, और यह बिल्कुल सही है। मेरी पोस्ट को दोबारा पढ़ें और आप देखेंगे कि मैं METHOD-scoped और क्लास-स्कोप्ड चर के बीच अंतर करता हूं। जैसा कि आपका संदर्भ बताता है, क्लास-स्कोप्ड वैरिएबल डिफ़ॉल्ट मानों के साथ आरंभ किया जाता है; हालांकि, विधि-स्कोप्ड चर नहीं है। इसके अतिरिक्त, जावा भाषा spec का संदर्भ लें, "एक स्थानीय चर को स्पष्ट रूप से एक मान दिया जाना चाहिए" पर विशेष ध्यान देना ... - भाग। http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 – Bane

+1

बढ़िया, यह मुझे स्पष्ट है। धन्यवाद। – Sotti

0

ऑब्जेक्ट की आपकी घोषणा वास्तव में ढेर पर MyClass के उदाहरण के लिए एक सूचक, या संदर्भ की घोषणा है। यदि आप सूचक को प्रारंभ नहीं करते हैं तो आपको अनिवार्य रूप से यादृच्छिक रूप से इंगित करने वाला पॉइंटर मिलता है। पॉइंटर को NULL में प्रारंभ करने की व्याख्या के द्वारा आप इसे एक पूर्ण पते पर इंगित करने के लिए सेट कर रहे हैं कि संकलक जानता है कि अमान्य है।

अतिरिक्त भ्रम जावा में शुरू की गई है, क्योंकि यह परोक्ष आप के लिए शून्य करने के लिए सदस्य चर initialises है।

यह एक थोड़ा और अधिक समझ में आप निचले स्तर भाषाओं का उपयोग किया है सी ++ की तरह बना देता है।

+0

मुझे नहीं लगता कि आपका दावा सही है कि जावा-वैरिएबल को नल की मात्रा में प्रारंभ करने में विफलता कहीं यादृच्छिक इंगित करती है। मैं समझता हूं कि आप क्या प्राप्त कर रहे हैं, लेकिन मुझे नहीं लगता कि यह मानना ​​सही है कि आप इसे शुरू किए बिना एक चर घोषित कर सकते हैं और इस प्रकार स्मृति के एक यादृच्छिक टुकड़े तक पहुंच प्राप्त कर सकते हैं। मैं समझता हूं कि निम्न-स्तरीय भाषाएं इसे इस तरह से संभालती हैं, लेकिन इसका मतलब यह नहीं है कि जावा ऐसा ही करता है। – Bane

+0

@Bane यह चर्चा करने के लिए बहुत अधिक उपज नहीं करेगा - यदि कोई है - एक स्थानीय चर असाइनमेंट से पहले है, क्योंकि आप उस मान को नहीं देख सकते हैं: कंपाइलर और बाइटकोड सत्यापनकर्ता आपको इसे निर्दिष्ट करने से पहले स्थानीय चर तक पहुंचने नहीं देगा। जब तक आप बाइटकोड सत्यापनकर्ता को अक्षम नहीं करते हैं और उस कार्य को करने के लिए बाइटकोड मैनिपुलेशन का उपयोग नहीं करते हैं। –

+0

यह मेरा मुद्दा था। ;) – Bane

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