"नमस्कार, अमीगो! कुछ दिन पहले मैंने आपको ओवरलोडिंग के तरीकों के बारे में बताया था। क्या आप सब कुछ समझ गए?"

"हाँ। मुझे याद है। प्रत्येक वर्ग विधि अद्वितीय होनी चाहिए। एक सदस्य विधि अद्वितीय है यदि कक्षा में समान नाम और पैरामीटर प्रकार (और पैरामीटर का क्रम मायने रखता है) के साथ कोई अन्य विधि नहीं है।"

"बहुत अच्छा! मैं देख रहा हूँ कि आपने वह पाठ अच्छी तरह से सीख लिया है। आज मैं इस विषय में आपके ज्ञान का थोड़ा सा विस्तार करना चाहता हूँ। आपको क्या लगता है कि प्रत्येक मामले में किस विधि को बुलाया जाएगा?"

कोड
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) कहा जाएगा।

दूसरे मामले में, हमारे पास बाइट लेने वाली कोई विधि नहीं है। लेकिन दो तरीके हैं जो एक छोटा और एक इंट लेते हैं। टाइप वाइडिंग नियमों के आधार पर, एक बाइट को पहले शॉर्ट तक चौड़ा किया जाएगा, और फिर एक इंट तक चौड़ा किया जाएगा। इस प्रकार, फैसला यह है कि शून्य प्रिंट (लघु एन)। बुलाया जाएगा।

तीसरे मामले में, हमारे पास स्ट्रिंग लेने वाली विधि के साथ 100% मिलान होता है। शून्य प्रिंट (स्ट्रिंग एस)। विधि कहा जाएगा।

चौथा मामला अस्पष्ट है। शून्य का कोई विशिष्ट प्रकार नहीं है। संकलक इस कोड को संकलित करने से मना कर देगा । इस मामले में, हमें तीसरी विधि को कॉल करने के लिए 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);
 }
}

पहले मामले में, बाइट प्रकार को छोटा करने के लिए चौड़ा किया जाएगा और पहली विधि कहलाएगी: शून्य प्रिंट (लघु एन)। .

दूसरे मामले में, इंट से इंटीजर में एक निहित चौड़ा रूपांतरण होगा, और फिर दूसरी विधि कहलाएगी: शून्य प्रिंट (इंटीजर एन)। .

"मुझे इसकी उम्मीद नहीं थी।"

"नहीं, यहाँ असली आश्चर्य है:"

जावा कोड विवरण
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 को पूर्णांक तक बढ़ाया जाएगा। क्योंकि पूर्णांक के लिए कोई विधि नहीं है, सबसे उपयुक्त विधि (और जिसे कहा जाता है) शून्य प्रिंट (ऑब्जेक्ट ओ) है

दूसरे मामले में, कोई संकलन त्रुटियां नहीं होंगी और शून्य प्रिंट (स्ट्रिंग एस) कहा जाएगा, जो कुछ हद तक स्पष्ट नहीं है।

"अमीगो, मुझे उम्मीद है कि आप समझ गए होंगे कि ऐसे मामलों में टाइप कास्ट ऑपरेटर निर्दिष्ट करना सबसे अच्छा होता है (जैसा कि हमने «(बाइट)» के साथ किया था) यह जानने के लिए कि वास्तव में किस विधि को कॉल किया जाएगा।"

"मैंने कभी नहीं सोचा था कि ओवरलोडिंग विधियों से कोई समस्या आएगी। लेकिन फिर आप साथ आते हैं। धन्यवाद, ऋषि। मैं इस बिंदु पर अपना पहरा रखूंगा।"