1. संदर्भ चल

जावा भाषेत, दोन प्रकारचे चल आहेत: आदिम चल आणि इतर सर्व काही. जसे घडते तसे, आम्ही आता "बाकी सर्व काही" बद्दल बोलणार आहोत.

खरेतर, आदिम चल आणि संदर्भ चल आहेत असे म्हणणे अधिक योग्य होईल . तर हे संदर्भ चल काय आहेत?

आदिम प्रकारांच्या विपरीत, ज्यांचे व्हेरिएबल्स थेट मूल्ये संग्रहित करतात, संदर्भ चल वस्तूंचे संदर्भ संग्रहित करतात. म्हणजेच, मेमरीमध्ये कुठेतरी एक ऑब्जेक्ट आहे आणि संदर्भ व्हेरिएबल फक्त या ऑब्जेक्टचा पत्ता मेमरीमध्ये संग्रहित करतो (ऑब्जेक्टचा संदर्भ).

फक्त आदिम प्रकार व्हेरिएबल्समध्ये थेट मूल्ये साठवतात. इतर सर्व प्रकार फक्त ऑब्जेक्ट संदर्भ साठवतात . तसे, तुम्हाला असे दोन प्रकारचे व्हेरिएबल्स आधीच आले आहेत - Stringव्हेरिएबल्स आणि अॅरे व्हेरिएबल्स.

अॅरे आणि स्ट्रिंग दोन्ही मेमरीमध्ये कुठेतरी साठवलेल्या वस्तू आहेत. Stringव्हेरिएबल्स आणि अॅरे व्हेरिएबल्स फक्त ऑब्जेक्ट्सचे संदर्भ साठवतात.

Java मध्ये संदर्भ चल

int a, int b and double dहे आदिम चल आहेत जे त्यांची मूल्ये स्वतःमध्ये साठवतात.

व्हेरिएबल हा एक संदर्भ आहे आणि मेमरीमध्ये ऑब्जेक्टचा String strपत्ता (संदर्भ) संग्रहित करतो .String

आदिम प्रकाराच्या व्हेरिएबलला आदिम मूल्य नियुक्त करताना, त्याचे मूल्य कॉपी केले जाते (डुप्लिकेट). संदर्भ व्हेरिएबल नियुक्त करताना, केवळ ऑब्जेक्टचा पत्ता कॉपी केला जातो - ऑब्जेक्ट स्वतः कॉपी केला जात नाही .


2. संदर्भ काय आहेत?

संदर्भ व्हेरिएबल्स आणि प्रिमिटिव्ह व्हेरिएबल्समध्ये मूलभूत फरक काय आहे?

प्रिमिटिव्ह व्हेरिएबल हे बॉक्ससारखे असते: तुम्ही त्यात काही मूल्य साठवू शकता. संदर्भ चल हे कागदाच्या तुकड्यासारखे असते ज्यावर फोन नंबर असतो.

कार वि कारच्या चाव्या

कल्पना करा की तुम्ही तुमच्या मित्राला त्याच्या वाढदिवसाला कार देण्याचे ठरवले आहे. तुम्ही ते एका बॉक्समध्ये गुंडाळून तुमच्यासोबत नेणार नाही: त्यासाठी कार खूप मोठी आहे.

कारच्या चाव्या ठेवण्याइतपत मोठ्या बॉक्समध्ये सादर करणे अधिक सोयीचे आहे. तुमच्या मित्राला बॉक्समधून चाव्या मिळाल्यावर सर्वकाही समजेल. जेव्हा तुम्ही फक्त चाव्या सोपवू शकता तेव्हा संपूर्ण कार तुमच्यासोबत नेण्याची गरज नाही.

एक व्यक्ती वि तिचा फोन नंबर

किंवा येथे दुसरी तुलना आहे: एक व्यक्ती आणि तिचा फोन नंबर. फोन नंबर ही व्यक्ती नसून तिला कॉल करण्यासाठी, तिला काही माहिती विचारण्यासाठी किंवा सूचना देण्यासाठी फोन नंबर वापरला जाऊ शकतो.

त्याचप्रमाणे, एखाद्या वस्तूशी संवाद साधण्यासाठी संदर्भ वापरला जातो. सर्व वस्तू संदर्भ वापरून एकमेकांशी संवाद साधतात. "लोकांची देवाणघेवाण" करण्याऐवजी, आम्ही फक्त फोन नंबरची देवाणघेवाण करतो.

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

संदर्भ आणखी एक फायदा देतो: तुम्ही एखाद्या पद्धतीचा संदर्भ देऊ शकता आणि ती पद्धत ऑब्जेक्टचा संदर्भ वापरून, त्याच्या पद्धती कॉल करून आणि ऑब्जेक्टमधील डेटा ऍक्सेस करून सुधारित (बदल) करण्यास सक्षम असेल.


3. संदर्भ नियुक्त करणे

संदर्भ व्हेरिएबल्स नियुक्त करताना, केवळ मेमरीमधील ऑब्जेक्टचा पत्ता नियुक्त केला जातो. वस्तू स्वतः दिसत नाहीत किंवा अदृश्य होत नाहीत.

हा दृष्टिकोन मोठ्या प्रमाणात मेमरी कॉपी करणे टाळतो. जर तुम्हाला एखाद्या पद्धतीमध्ये खूप मोठी वस्तू पास करायची असेल, तर आम्ही फक्त ऑब्जेक्ट संदर्भ पास करतो आणि तेच. संदर्भ खूपच कमी जागा घेतो.

संदर्भ नियुक्त करणे

सर्व संदर्भ चलांचा आकार (त्यांच्या प्रकाराकडे दुर्लक्ष करून) समान आहे — 4 बाइट्स (इंटरप्रमाणे). परंतु! जर तुमचा अनुप्रयोग 64-बिट Java मशीनवर चालत असेल, तर सर्व संदर्भ 8 बाइट्स (64 बिट) आकाराचे असतील.

इतकेच काय, संदर्भ फक्त एकमेकांना दिले जाऊ शकतात. तुम्ही संदर्भ बदलू शकत नाही किंवा संदर्भ चलांना अनियंत्रित मूल्ये नियुक्त करू शकत नाही:

कोड वर्णन
String hello = "Hello";
String s = hello;
याची परवानगी आहे
String hello = "Hello";
hello++;
पण याला परवानगी नाही
String hello = 0x1234;
आणि याला परवानगी नाही

4. एक nullसंदर्भ

आणि संदर्भ व्हेरिएबलला अद्याप काहीही नियुक्त केले नसल्यास ते काय संग्रहित करते?

ते शून्य संदर्भ साठवते. nullएक विशेष Java कीवर्ड आहे ज्याचा अर्थ संदर्भ नसणे (रिक्त संदर्भ). मूल्य 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 चे संदर्भ देणे

dataआणि व्हेरिएबल्स arrayमेमरीमध्ये समान कंटेनरचा संदर्भ देतात (स्टोअर संदर्भ).

व्हेरिएबल valueस्ट्रिंग ऑब्जेक्टचा संदर्भ संग्रहित करते ( "Hello").

अॅरेचे सेल ऑब्जेक्टचे फक्त संदर्भ साठवतात "Hello".

खरं तर, कोणतीही वस्तू डुप्लिकेट केलेली नाही - फक्त संदर्भ कॉपी केले जातात.



6. C/C ++ भाषेशी तुलना

मुलाखतींमध्ये, कधीकधी Java प्रोग्रामरना विचारले जाते की Java मधील पद्धतींमध्ये डेटा कसा पास केला जातो? आणि कधीकधी प्रश्न असा आहे की डेटा संदर्भाद्वारे किंवा मूल्याद्वारे पास केला जातो?

हा प्रश्न C++ वरून आला आहे, परंतु Java मध्ये फारसा अर्थपूर्ण नाही . Java मध्ये, पॅरामीटर्सना नेहमी फक्त वितर्कांची मूल्ये नियुक्त केली जातात. तर योग्य उत्तर " मूल्यानुसार " असेल .

परंतु तुमची स्थिती स्पष्ट करण्यासाठी तयार रहा , कारण तुम्ही ताबडतोब प्रतिवाद ऐकू शकता: "आदिम प्रकार मूल्यानुसार पास केले जातात आणि संदर्भ प्रकार संदर्भाद्वारे पास केले जातात."

या समस्येचा उगम या वस्तुस्थितीपासून झाला आहे की अनेक Java प्रोग्रामर पूर्वी C++ प्रोग्रामर होते. त्या प्रोग्रामिंग भाषेत, पॅरामीटर्स पद्धतींना कसे पास केले जातात हा प्रश्न खूप महत्वाचा होता.

Java मध्ये, सर्व काही अस्पष्ट आहे: आदिम प्रकार संग्रहित मूल्ये आणि संदर्भ प्रकार देखील एक मूल्य संग्रहित करतात - एक संदर्भ. व्हेरिएबलला मूल्य मानले जाते की नाही हा प्रश्न आहे .

C++ मध्ये, व्हेरिएबल ऑब्जेक्ट आणि ऑब्जेक्टचा संदर्भ दोन्ही संग्रहित करू शकतो. आदिम प्रकारांबद्दलही हेच खरे होते: आदिम चल मूल्य संचयित करू शकते किंवा व्हेरिएबलला संदर्भ म्हणून घोषित करू शकते int. त्यामुळे, गोंधळ टाळण्यासाठी, C++ प्रोग्रामर नेहमी संदर्भ म्हणून ऑब्जेक्टचा संदर्भ घेतात , आणि ऑब्जेक्टलाच - मूल्य म्हणून.

C++ मध्‍ये, एका व्हेरिएबलमध्‍ये ऑब्‍जेक्‍ट असते, परंतु दुसर्‍यामध्‍ये त्या ऑब्‍जेक्‍टचा संदर्भ असतो. त्यानुसार, व्हेरिएबल काय साठवते - ऑब्जेक्ट स्वतः किंवा फक्त त्याचा संदर्भ - हा प्रश्न खूप महत्वाचा होता. जेव्हा एखादी वस्तू एखाद्या पद्धतीत पास केली जाते, तेव्हा ती कॉपी केली जाते (मूल्यानुसार पास केली असल्यास), आणि कॉपी केली जात नाही (संदर्भानुसार पास केली असल्यास).

Java मध्ये, हे द्वैत अस्तित्वात नाही, म्हणून योग्य उत्तर आहे: वितर्क जावा पद्धतींना मूल्यानुसार पास केले जातात . जेव्हा आपण संदर्भ व्हेरिएबल्सबद्दल बोलत असतो तेव्हा हे मूल्य एक संदर्भ असते.