1. संदर्भ चर

जावा भाषा में, दो प्रकार के चर होते हैं: आदिम चर और बाकी सब। जैसा कि होता है, अब हम "बाकी सब कुछ" के बारे में बात करने जा रहे हैं।

वास्तव में, यह कहना अधिक सही होगा कि आदिम चर और संदर्भ चर हैं । तो ये संदर्भ चर क्या हैं?

आदिम प्रकारों के विपरीत, जिनके चर मूल्यों को सीधे संग्रहीत करते हैं, संदर्भ चर वस्तुओं के संदर्भों को संग्रहीत करते हैं। यही है, स्मृति में कहीं कोई वस्तु है, और संदर्भ चर केवल इस वस्तु के पते को स्मृति (ऑब्जेक्ट का संदर्भ) में संग्रहीत करता है।

केवल आदिम प्रकार सीधे चर के भीतर मूल्यों को संग्रहीत करते हैं। अन्य सभी प्रकार केवल एक वस्तु संदर्भ संग्रहीत करते हैं । वैसे, आप पहले से ही इस तरह के दो प्रकार के चर - Stringचर और सरणी चर का सामना कर चुके हैं।

एक सरणी और एक स्ट्रिंग दोनों ही स्मृति में कहीं संग्रहीत वस्तुएं हैं। Stringचर और सरणी चर केवल वस्तुओं के संदर्भों को संग्रहीत करते हैं।

जावा में संदर्भ चर

int a, int b and double dआदिम चर हैं जो अपने मूल्यों को अपने अंदर संग्रहीत करते हैं।

एक चर एक संदर्भ है और स्मृति में String strकिसी वस्तु के पते (संदर्भ) को संग्रहीत करता है ।String

आदिम प्रकार के एक चर के लिए एक आदिम मान निर्दिष्ट करते समय, इसका मान कॉपी (डुप्लिकेट) किया जाता है। संदर्भ चर निर्दिष्ट करते समय, केवल ऑब्जेक्ट का पता कॉपी किया जाता है - ऑब्जेक्ट स्वयं कॉपी नहीं किया जाता है


2. संदर्भ क्या हैं?

संदर्भ चर और आदिम चर के बीच मूलभूत अंतर क्या है?

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

एक कार बनाम कार की चाबी

कल्पना कीजिए कि आप अपने दोस्त को उसके जन्मदिन पर कार देने का फैसला करते हैं। आप इसे एक बॉक्स में लपेटकर अपने साथ नहीं ले जाएंगे: कार उसके लिए बहुत बड़ी है।

कार की चाबियों को रखने के लिए पर्याप्त बड़े बॉक्स में केवल कार की चाबियां पेश करना कहीं अधिक सुविधाजनक है। जब आपका दोस्त बॉक्स से चाबी निकालेगा तो वह सब कुछ समझ जाएगा। जब आप बस चाबियां सौंप सकते हैं तो पूरी कार को अपने साथ ले जाने की कोई जरूरत नहीं है।

एक व्यक्ति बनाम उसका फोन नंबर

या यहाँ एक और तुलना है: एक व्यक्ति और उसका फ़ोन नंबर। एक फ़ोन नंबर व्यक्ति नहीं है, लेकिन एक फ़ोन नंबर का उपयोग उसे कॉल करने, उससे कुछ जानकारी माँगने, या निर्देश प्रदान करने के लिए किया जा सकता है।

इसी तरह, किसी ऑब्जेक्ट के साथ इंटरैक्ट करने के लिए एक रेफरेंस का उपयोग किया जाता है। सभी वस्तुएं संदर्भों का उपयोग करके एक दूसरे के साथ बातचीत करती हैं। "लोगों का आदान-प्रदान" करने के बजाय, हम केवल फ़ोन नंबरों का आदान-प्रदान करते हैं।

प्रिमिटिव वेरिएबल को वैल्यू असाइन करते समय, इसके वैल्यू को कॉपी (डुप्लिकेट) किया जाता है। संदर्भ चर के लिए मान निर्दिष्ट करते समय, ऑब्जेक्ट का केवल पता (फ़ोन नंबर) कॉपी किया जाता है - ऑब्जेक्ट स्वयं कॉपी नहीं किया जाता है।

एक संदर्भ एक और लाभ प्रदान करता है: आप किसी विधि के लिए एक वस्तु संदर्भ पारित कर सकते हैं, और विधि वस्तु के संदर्भ का उपयोग करके वस्तु को संशोधित (बदल) करने में सक्षम होगी, इसके तरीकों को बुलाकर और वस्तु के अंदर डेटा तक पहुंच कर।


3. संदर्भ निर्दिष्ट करना

संदर्भ चर निर्दिष्ट करते समय, स्मृति में केवल वस्तु का पता निर्दिष्ट किया जाता है। वस्तुएं स्वयं प्रकट या गायब नहीं होती हैं।

यह दृष्टिकोण बड़ी मात्रा में मेमोरी की नकल करने से बचता है। यदि आपको एक बहुत बड़ी वस्तु को एक विधि में पारित करने की आवश्यकता है, तो हम केवल वस्तु संदर्भ को पास करते हैं और बस इतना ही। संदर्भ बहुत कम जगह लेता है।

संदर्भ सौंपना

सभी संदर्भ चर का आकार (उनके प्रकार की परवाह किए बिना) समान है - 4 बाइट्स (एक इंट की तरह)। लेकिन! यदि आपका एप्लिकेशन 64-बिट जावा मशीन पर चल रहा है, तो सभी संदर्भों का आकार 8 बाइट्स (64 बिट्स) होगा।

क्या अधिक है, संदर्भ केवल एक दूसरे को निर्दिष्ट किए जा सकते हैं। आप संदर्भों को बदल नहीं सकते हैं या संदर्भ चर के लिए मनमाना मान निर्दिष्ट नहीं कर सकते हैं:

कोड विवरण
String hello = "Hello";
String s = hello;
इसकी अनुमति है
String hello = "Hello";
hello++;
लेकिन इसकी अनुमति नहीं है
String hello = 0x1234;
और इसकी अनुमति नहीं है

4. एक nullसंदर्भ

और अगर अभी तक कुछ भी असाइन नहीं किया गया है तो संदर्भ चर स्टोर क्या करता है?

यह एक अशक्त संदर्भ संग्रहीत करता है। nullएक विशेष जावा कीवर्ड है जिसका अर्थ संदर्भ की अनुपस्थिति (एक खाली संदर्भ) है। मान nullको किसी भी संदर्भ चर को सौंपा जा सकता है।

सभी संदर्भ चर nullतब तक हैं जब तक कि उनके पास किसी प्रकार का संदर्भ निर्दिष्ट न हो।

उदाहरण:

कोड विवरण
class Person
{
   public static String name;
   public static int age;
}


चर String nameका एक डिफ़ॉल्ट मान है null:।
चर int ageका एक डिफ़ॉल्ट मान है 0:।

स्थानीय चर जिन्हें कोई मान निर्दिष्ट नहीं किया गया है, उन्हें आदिम और संदर्भ दोनों प्रकार के लिए अप्रारंभीकृत माना जाता है।

यदि एक चर किसी वस्तु के संदर्भ को संग्रहीत करता है, और आप चर के मान को साफ़ करना चाहते हैं, तो इसे केवल एक शून्य संदर्भ निर्दिष्ट करें।

कोड विवरण
String s = null;
s = "Hello";
s = null;
sभंडार null। एक स्ट्रिंग ऑब्जेक्ट स्टोर्स
sके संदर्भ को संग्रहीत करता है ।
snull

5. विधियों के संदर्भ पास करना

यदि किसी विधि में पैरामीटर हैं जो संदर्भ प्रकार हैं , तो मानों को विधि में उसी तरह पास किया जाता है जैसे गैर-संदर्भ चर के साथ काम करते समय। पैरामीटर को केवल अन्य चर का मान असाइन किया गया है।

उदाहरण:

कोड विवरण
class Solution
{
   public static void fill(String[] array, String value)
   {
      for (int i = 0; i < array.length; i++)
        array[i] = value;
   }

   public static void main(String[] args)
   {
     String[] data = new String[10];
     fill(data, "Hello");
   }
}


fillपास की गई सरणी ( array) को पास किए गए मान ( value) से भरता है।

जब fillविधि को कॉल किया जाता है, तो पैरामीटर को सरणी arrayके संदर्भ में असाइन किया जाता है । dataचर valueको स्ट्रिंग ऑब्जेक्ट ("हैलो") का संदर्भ दिया गया है।

विधि को कॉल करने से पहले मेमोरी इस तरह दिखती है fill:

विधियों के संदर्भ पास करना

जब fill विधि चल रही हो तो मेमोरी इस तरह दिखती है :

विधियों के संदर्भ पास करना 2

और चर स्मृति में एक ही कंटेनर को संदर्भित करते हैं (संदर्भों को स्टोर करते हैं) dataarray

चर valueस्ट्रिंग ऑब्जेक्ट ( "Hello") के संदर्भ को संग्रहीत करता है।

सरणी की कोशिकाएँ भी केवल "Hello"वस्तु के संदर्भों को संग्रहीत करती हैं।

वास्तव में, किसी भी वस्तु की नकल नहीं की जाती है - केवल संदर्भों की नकल की जाती है।



6. C/C++ भाषा के साथ तुलना

साक्षात्कार में, कभी-कभी जावा प्रोग्रामर से पूछा जाता है कि जावा में विधियों को डेटा कैसे पास किया जाता है? और कभी-कभी सवाल यह होता है कि क्या डेटा संदर्भ द्वारा पारित किया जाता है या मूल्य द्वारा?

यह प्रश्न सी ++ से आता है, लेकिन जावा में बहुत सार्थक नहीं है । जावा में, पैरामीटर्स को हमेशा केवल तर्कों के मान असाइन किए जाते हैं। तो सही उत्तर " मूल्य से " होगा।

लेकिन अपनी स्थिति की व्याख्या करने के लिए तैयार रहें , क्योंकि आप तुरंत मुंहतोड़ जवाब सुन सकते हैं: "आदिम प्रकार मान द्वारा पारित किए जाते हैं, और संदर्भ प्रकार संदर्भ द्वारा पारित किए जाते हैं।"

इस मुद्दे की उत्पत्ति इस तथ्य से हुई है कि कई जावा प्रोग्रामर अतीत में सी ++ प्रोग्रामर थे। उस प्रोग्रामिंग लैंग्वेज में, पैरामीटर्स को मेथड्स में कैसे पास किया जाता है, यह सवाल बहुत महत्वपूर्ण था।

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

सी ++ में, एक चर किसी ऑब्जेक्ट और ऑब्जेक्ट दोनों के संदर्भ को स्टोर कर सकता है। आदिम प्रकारों के बारे में भी यही सच था: एक आदिम चर एक मान को संग्रहीत कर सकता है या चर को एक संदर्भ के रूप में घोषित कर सकता है int। इसलिए, भ्रम से बचने के लिए, सी ++ प्रोग्रामर हमेशा ऑब्जेक्ट को संदर्भ के रूप में संदर्भ के रूप में संदर्भित करते हैं , और ऑब्जेक्ट स्वयं - एक मान के रूप में।

सी ++ में, आप आसानी से ऐसी स्थिति प्राप्त कर सकते हैं जहां एक चर में ऑब्जेक्ट होता है, लेकिन दूसरे में उस ऑब्जेक्ट का संदर्भ होता है। तदनुसार, एक चर क्या संग्रहीत करता है - वस्तु स्वयं या उसके लिए केवल एक संदर्भ - का प्रश्न बहुत महत्वपूर्ण था। जब किसी ऑब्जेक्ट को किसी विधि में पारित किया गया था, तो उसे कॉपी किया गया था (यदि मूल्य द्वारा पारित किया गया था), और कॉपी नहीं किया गया (यदि संदर्भ द्वारा पारित किया गया)।

जावा में, यह द्वैत मौजूद नहीं है, इसलिए सही उत्तर है: मान द्वारा जावा विधियों में तर्क पारित किए जाते हैं । जब हम संदर्भ चर के बारे में बात कर रहे हैं, तो यह मान एक संदर्भ है।