"हॅलो, अमिगो! काही दिवसांपूर्वी मी तुला ओव्हरलोडिंग पद्धतींबद्दल सांगितले होते. तुला सर्व काही समजले का?"

"होय. मला आठवते. प्रत्येक वर्ग पद्धत युनिक असणे आवश्यक आहे. जर क्लासमध्ये समान नाव आणि पॅरामीटर प्रकार असलेली दुसरी पद्धत नसेल (आणि पॅरामीटर्सचा क्रम महत्त्वाचा असेल) तर सदस्य पद्धत अद्वितीय आहे."

"खूप छान! मला दिसतंय की तुम्ही तो धडा चांगला शिकलात. आज मला या विषयातलं तुझं ज्ञान थोडं वाढवायचं आहे. प्रत्येक बाबतीत कोणती पद्धत बोलावली जाईल असं तुम्हाला वाटतं?"

कोड
class Cat
{
 public static void print(int n)
 {
  System.out.println(n);
 }
 public static void print(short n)
 {
  System.out.println(n);
 }
 public static void print(Integer n)
 {
  System.out.println(n);
 }
 public static void print(String s)
 {
  System.out.println(s);
 }
public static void main(String[] args)
{
  Cat.print(1);
  Cat.print((byte)1);
  Cat.print("1");
  Cat.print(null);
 }
}

"हे सांगणे कठीण आहे."

"पहिल्या केसमध्ये, 1 एक int आहे . आमच्याकडे int घेणाऱ्या पद्धतीशी 100% जुळत आहे. प्रथम शून्य प्रिंट(int n) कॉल केला जाईल.

दुसऱ्या प्रकरणात, आमच्याकडे बाइट घेणारी पद्धत नाही. पण लहान आणि इंट अशा दोन पद्धती आहेत. प्रकार रुंदीकरणाच्या नियमांवर आधारित, बाइटला प्रथम शॉर्टमध्ये रुंद केले जाईल आणि नंतर इंटमध्ये रुंद केले जाईल. अशाप्रकारे, निर्णय असा आहे की शून्य प्रिंट (लहान n). म्हटले जाईल.

तिसऱ्या प्रकरणात, आमच्याकडे स्ट्रिंग घेणाऱ्या पद्धतीशी 100% जुळणी आहे. शून्य प्रिंट (स्ट्रिंग s). पद्धत म्हटले जाईल.

चौथी केस संदिग्ध आहे. null ला विशिष्ट प्रकार नाही. कंपाइलर हा कोड संकलित करण्यास नकार देईल . या प्रकरणात, तिसरी पद्धत कॉल करण्यासाठी आपल्याला Cat.print((Integer)null) आणि चौथ्याला कॉल करण्यासाठी Cat.print((String)null) लिहावे लागेल."

"ते खूप माहितीपूर्ण होते. धन्यवाद."

"मी सूचित करू इच्छितो की कॉल करण्याची योग्य पद्धत ठरवताना, प्रकार फक्त रुंद होऊ शकतात. ते अरुंद करू शकत नाहीत. या उदाहरणाचा विचार करा:"

कोड
class Cat
{
 public static void print(short n)
 {
  System.out.println(n);
 }
 public static void print(Integer n)
 {
  System.out.println(n);
 }

 public static void main(String[] args)
 {
  Cat.print((byte)1);
  Cat.print(1);
 }
}

पहिल्या प्रकरणात, बाइट प्रकार लहान करण्यासाठी रुंद केला जाईल आणि पहिल्या पद्धतीला म्हटले जाईल: शून्य प्रिंट(शॉर्ट एन). .

दुस-या प्रकरणात, int मधून Integer मध्ये एक अंतर्निहित रुंदीकरण रूपांतरण होईल, आणि नंतर दुसरी पद्धत म्हटले जाईल: void print(Integer n). .

"मला अशी अपेक्षा नव्हती."

"नाही, हे खरे आश्चर्य आहे:"

जावा कोड वर्णन
class Cat
{
 public static void print(Object o)
 {
  System.out.println(o);
 }
 public static void print(String s)
 {
  System.out.println(s);
 }

 public static void main(String[] args)
 {
  Cat.print(1);
  Cat.print(null);
 }
}
पहिल्या प्रकरणात, int पूर्णांकापर्यंत विस्तारित केले जाईल. पूर्णांकासाठी कोणतीही पद्धत नसल्यामुळे, सर्वात योग्य पद्धत (आणि ज्याला म्हणतात) शून्य प्रिंट (ऑब्जेक्ट ओ) आहे.

दुस-या बाबतीत, संकलित त्रुटी नसतील आणि शून्य प्रिंट (स्ट्रिंग s) कॉल केले जाईल, जे काहीसे स्पष्ट नाही.

"अमिगो, मला आशा आहे की तुम्हाला समजले असेल की अशा प्रकरणांमध्ये कोणती पद्धत कॉल केली जाईल हे जाणून घेण्यासाठी टाइप कास्ट ऑपरेटर (जसे आम्ही «(बाइट)» सह केले तसे) निर्दिष्ट करणे चांगले आहे."

"ओव्हरलोडिंग पद्धतींमुळे काही समस्या येतील असे मला कधीच वाटले नव्हते. पण मग तुम्ही सोबत या. धन्यवाद, ऋषी. मी या मुद्द्यावर माझे लक्ष ठेवेन."