2013-10-08 4 views
9
public class Test1 { 

    public static void main(String[] args) { 
     Test1 test1 = new Test1(); 
     test1.testMethod(null); 
    } 

    public void testMethod(String s){ 
     System.out.println("Inside String Method");  
    } 

    public void testMethod(Object o){ 
     System.out.println("Inside Object Method"); 
    } 
} 

जब मैं दिया कोड चलाने का प्रयास, मैं निम्नलिखित उत्पादन:अधिभारित तरीके कैसे काम करते हैं?

अंदर स्ट्रिंग विधि

किसी को भी क्यों String प्रकार पैरामीटर के साथ विधि कहा जाता रहा है व्याख्या कर सकते हैं?

+1

+1 यह सुपर आसान सवाल की तरह लग रहा था, लेकिन शून्य का उपयोग ... यह वास्तव में दिलचस्प है ... –

+2

संभवतः डुप्लिकेट [विधि ओवरलोडिंग में अजीब जावा शून्य व्यवहार] (http://stackoverflow.com/questions/14789478/ अजीब-जावा-नल-व्यवहार-इन-विधि-ओवरलोडिंग) –

+0

@ रोहितजैन यह सवाल पहले से ही [डुप्लिकेट] है [http://stackoverflow.com/questions/1545501/which-overload-will-get- चयनित- फॉर-नल-इन-जावा) – mariomario

उत्तर

19

सबसे विशिष्ट विधि तर्क अतिभारित तरीकों

इस मामले में के लिए चुना जाता है, StringObject के उपवर्ग है। इसलिए StringObject से अधिक विशिष्ट हो जाता है। इसलिए Inside String method मुद्रित है।

JLS-15.12.2.5

यदि एक से अधिक सदस्य विधि दोनों सुलभ और एक विधि मंगलाचरण के लिए लागू है से

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

BMT और LastFreeNickName के रूप में सही ढंग से सुझाव दिया है, (Object)null के नाम से जाना Object प्रकार विधि के साथ अतिभारित विधि का कारण होगा।

+3

लेकिन शून्य के लिए, स्ट्रिंग और ऑब्जेक्ट दोनों समान स्तर पर हैं, फिर स्ट्रिंग कैसे अधिक विशिष्ट हो सकती है? –

+5

पूरी तरह से सही! आप पैरामीटर के रूप में (ऑब्जेक्ट) शून्य को आज़मा सकते हैं और पास कर सकते हैं और यह दूसरी विधि का चयन करेगा। – LastFreeNickname

+3

जब भी यह आपके कोड में एक स्ट्रिंग अक्षर का सामना करता है, तो संकलक इस मामले में 'स्ट्रिंग ऑब्जेक्ट' बनाता है-इस मामले में, * शून्य *। – iMBMT

0

किसी मौजूदा उत्तर में जोड़ना, मुझे यकीन नहीं है कि यह प्रश्न के बाद से एक नए जावा संस्करण की वजह से है, लेकिन जब मैंने ऑब्जेक्ट के बजाय पैरामीटर के रूप में इंटीजर लेने के तरीके के साथ कोड संकलित करने का प्रयास किया , कोड अभी भी संकलित किया था। हालांकि, पैरामीटर के रूप में शून्य के साथ कॉल अभी भी रन-टाइम पर स्ट्रिंग पैरामीटर विधि का आह्वान किया गया है।

उदाहरण के लिए,

public void testMethod(int i){ 
    System.out.println("Inside int Method");  
} 

public void testMethod(String s){ 
    System.out.println("Inside String Method");  
} 

अभी भी उत्पादन दे देंगे:

Inside String Method 

जब कहा जाता है के रूप में:

test1.testMethod(null); 

इसके लिए मुख्य कारण यह है कि स्ट्रिंग के रूप में अशक्त को स्वीकार करता है एक मूल्य और int नहीं करता है। तो शून्य को एक स्ट्रिंग ऑब्जेक्ट के रूप में वर्गीकृत किया जाता है।

प्रश्न पर वापस आकर पूछे जाने पर, ऑब्जेक्ट केवल तभी होता है जब कोई नई वस्तु बनाई जाती है।यह द्वारा

test1.testMethod((Object) null); 

या एक आदिम डेटा प्रकार के लिए वस्तु के किसी भी प्रकार का उपयोग कर एक वस्तु के रूप में किसी भी प्रकार के कास्टिंग अशक्त द्वारा किया जाता है जैसे

test1.testMethod((Integer) null); 
    or 
test1.testMethod((Boolean) null); 

या बस

द्वारा एक नई वस्तु बनाने के द्वारा
test1.testMethod(new Test1()); 

यह ध्यान देने योग्य है कि

test1.testMethod((String) null); 

फिर से स्ट्रिंग विधि का आह्वान करेगा क्योंकि इससे स्ट्रिंग प्रकार का ऑब्जेक्ट बन जाएगा।

इसके अलावा,

test1.testMethod((int) null); 
    and 
test1.testMethod((boolean) null); 

बूलियन बूलियन और पूर्णांक कोई मान्य मान के रूप में और पूर्णांक के रूप में अशक्त को स्वीकार नहीं करते के बाद से एक संकलन समय त्रुटि दे देंगे! = पूर्णांक और बूलियन! =। इंटीजर और बूलियन प्रकार प्रकार int और बूलियन के ऑब्जेक्ट्स में डाला गया।

संबंधित मुद्दे