जावा में अशक्त करने के लिए आरंभिक वस्तु चर और वस्तु चर के बीच अंतर क्या है


12

मेरे पास निम्नलिखित दो वस्तु चर हैं

Date a;
Date b=null;

निश्चित रूप से 'ए' और 'बी' दोनों किसी भी वस्तु का जिक्र नहीं कर रहे हैं।

अब अगर मैं निम्नलिखित कथन का आह्वान करता हूं

System.out.println(a.toString());

एक संकलन समय त्रुटि होगी, जबकि यदि मैं निम्नलिखित कथन को लागू करता हूं

System.out.println(b.toString());

कोई संकलन समय त्रुटि नहीं होगी, लेकिन रनटाइम त्रुटि होगी। इसका क्या कारण है और एक शून्य मान का प्रतिनिधित्व करने के लिए वास्तव में 'बी' में किस मूल्य को संग्रहीत किया जाएगा?


2
SO पर कई बार पूछा और उत्तर दिया गया: स्थानीय चर जावा में आरंभिक क्यों नहीं हैं? , Uninitialized चर और सदस्यों को जावा में और इन से जुड़े कई सवालों में
gnat

@gnat, क्या "uninitialized" और "null" के बीच के अंतर से कोई और सवाल करता है? सिर्फ इसलिए कि उत्तर समान है इसका मतलब यह नहीं है कि यह एक डुप्लिकेट प्रश्न है।
डगएम

@DougM यकीन है, क्या आपने मेरे द्वारा संदर्भित पहला प्रश्न पढ़ा था? "क्या कोई कारण था कि जावा के डिजाइनरों ने महसूस किया कि स्थानीय चर को एक डिफ़ॉल्ट मान नहीं दिया जाना चाहिए? यदि उदाहरण के लिए, उदाहरण के चर को एक डिफ़ॉल्ट मान दिया जा सकता है, तो हम स्थानीय चर के लिए ऐसा क्यों नहीं कर सकते हैं?" (FWIW यह तकनीकी रूप से एक डुप्लिकेट नहीं हो सकता है, क्योंकि यह किसी अन्य साइट पर है)
gnat

1
"अनइंस्टॉलिज्ड" और "इनिशियलाइज्ड एन नल" के बीच के अंतर को संबोधित नहीं करता है, केवल "क्यों चर स्वचालित रूप से अशक्त करने के लिए निष्क्रिय नहीं हैं?" एक ही विषय, थोड़ा अलग सवाल।
डगएम

जवाबों:


3

ऐसा इसलिए है क्योंकि स्थानीय चर की स्थिति इसके दायरे में नियंत्रित होती है

 // method/loop/if/try-catch etc...
 {
   Date d; // if it's not intialised in this scope then its not intialised  anywhere
 }

जो खेतों के लिए नहीं है

class Foo{
 Date d; // it could be intialised anywhere, so its out of control and java will set to null for you
}

अब, इसके चर को शून्य करने और इसे तुरंत उपयोग करने के लिए क्यों ठीक है? शायद यह एक ऐतिहासिक गलती है जो कभी-कभी भयानक गलतियों की ओर ले जाती है

 {
  Date d = null;
  try{
  }catch{ // hide it here 
  }
  return d;
 } 

अब शब्दार्थ भेद क्या है?

Date d;

Dateहालांकि, ऐसे चर को घोषित करता है, जो एक प्रकार की वस्तु की ओर इशारा करता है , हालांकि

Date d= null; 

बिल्कुल वैसा ही करता है लेकिन संदर्भ इस समय को शून्य करने के लिए इशारा कर रहा है, अशक्त किसी भी संदर्भ की तरह है, यह एक देशी सूचक का स्थान लेता है, जो कि 32-बिट मशीनों पर 4 बाइट और 64-बिट मशीनों पर 8 बाइट्स है


इस केवल दोहराने मुद्दा बनाया है और एक में विस्तार से बताया जा रहा है पहले इस सवाल का जवाब एक घंटे पहले पोस्ट
कुटकी

@gnat आपकी टिप्पणी के लिए धन्यवाद, लेकिन मुझे नहीं लगता कि यह है, चीयर्स
स्लीमैन जेनिडी

क्या आपका मतलब है कि null भी मेमोरी में कहीं संग्रहित वस्तु है और null के साथ असाइन किए गए सभी ऑब्जेक्ट वेरिएबल उस null ऑब्जेक्ट की ओर इशारा करते हैं।
हरीश_नियम

@ हरीश.नहीं नहीं, मैंने ऐसा नहीं कहा, मैंने इसका संदर्भ और वस्तु नहीं कहा
स्लीमन जेनिडी

उदाहरण में आपने 'd' को एक संदर्भ दिया है .. यह एक प्रकार की वस्तु का सन्दर्भ है Date ... इसी प्रकार यदि शून्य एक संदर्भ है .. तो यह किस वस्तु को संदर्भित करता है ..?
हरीश .9

19

वर्ग क्षेत्रों के लिए कोई अंतर नहीं है। वे nullऑब्जेक्ट के लिए डिफ़ॉल्ट रूप से, संख्यात्मक मान के लिए 0 और falseबूलियन के लिए हैं।

विधियों में घोषित चर के लिए - जावा को उन्हें आरंभिक बनाने की आवश्यकता होती है। जब वे एक्सेस कर रहे हों, तो उन्हें इनिशियलाइज़ न करना एक कंपाइल टाइम एरर का कारण बनता है।

क्या कारण है? वर्ग फ़ील्ड को किसी भी विधि द्वारा संशोधित किया जा सकता है। किसी भी क्रम में विधि को लागू किया जाता है। सभी गैर-निजी क्षेत्रों को अन्य वर्गों और / या उस वर्ग का विस्तार करने वाले वर्गों द्वारा संशोधित किया जा सकता है। इसलिए, एक असिंचित चर के बारे में सूचित करने का कोई मतलब नहीं है, क्योंकि इसे कई, कई जगहों पर सौंपा जा सकता है।

हालांकि, तरीकों के अंदर चर स्थानीय हैं और केवल विधि के अंदर ही संशोधित किए जा सकते हैं। इसलिए यह संभव गलतियों को इंगित करने के लिए संभव और तर्कसंगत दोनों है। और कंपाइलर इसे करने की कोशिश करता है। यदि यह जानता है कि फ़ील्ड को प्रारंभ नहीं किया गया है, तो यह एक त्रुटि दिखाएगा, क्योंकि यही वह है जो आप चाहते हैं। यदि यह सुनिश्चित नहीं है - यह एक चेतावनी देगा, ताकि आप सुनिश्चित कर सकें।

public static class Test {
    Date a; // ok 
    Date b = null; // ok

    public void test() {
        Date c;
        Date d = null;

        System.out.println(a.toString());
        System.out.println(b.toString());
        System.out.println(c.toString()); // error
        System.out.println(d.toString()); // warning
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.