2013-02-23 80 views
8

मुझे अपने प्रोग्राम में कोई समस्या आ रही है और मैंने इसे नीचे एक छोटे कोड स्निपेट के साथ साफ़ कर दिया है। क्या कोई यह समझा सकता है कि यह क्यों हो रहा है?स्ट्रिंग पसंद करते हुए विधि को शून्य करना, ऑब्जेक्ट

class ObjectnullTest { 

    public void printToOut(String string) { 

     System.out.println("I am null string"); 
    } 


    public void printToOut(Object object) 

     System.out.println("I am null object"); 
    } 



class Test { 

    public static void main(String args[]) { 

     ObjectnullTest a = new ObjectnullTest(); 
     a.printToOut(null); 

    } 
} 

यह हमेशा I am null string प्रिंट करता है।

मैं कारण जानना चाहता हूं ताकि मैं कोड को संशोधित कर सकूं।

अग्रिम धन्यवाद।

+1

संभव डुप्लिकेट (http://stackoverflow.com/questions/5229809/method-overloading-for-null-parameter) – jlordo

+0

कई पर चुना जाता है अन्य, देखें [http://stackoverflow.com/search?q=%5Bjava%5D+overloading+null ](http://stackoverfl ow.com/search?q=%5Bjava%5D+overloading+null) – jlordo

+0

एक ही मानदंड प्रश्न के लिए खेद है, उचित कुंजी शर्तों के साथ खोजने में असमर्थ। –

उत्तर

11

यह क्योंकि विधि के अलावा मामले

सबसे विशिष्ट विधि संकलन समय पर चुना जाता है ओवरलोडिंग है।

के रूप में 'java.lang.String' एक और अधिक विशिष्ट प्रकार 'java.lang.Object' की तुलना में है। आपके मामले में विधि जो 'स्ट्रिंग' को पैरामीटर के रूप में लेती है उसे चुना जाता है।

इसकी स्पष्ट रूप से JLS में प्रलेखित:

दूसरे चरण के प्रकार सदस्य तरीकों के लिए पिछले चरण में निर्धारित खोज करता है। यह चरण विधि के नाम और के प्रकारों का उपयोग करने के लिए तर्क अभिव्यक्तियों का पता लगाने के लिए तर्क अभिव्यक्तियों का उपयोग करता है जो और लागू होते हैं, यानी, घोषणाएं जिन्हें दिए गए तर्कों पर सही तरीके से बुलाया जा सकता है।

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

5

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

a.printToOut((Object)null); 
2

कृपया देखें jls कि विस्तार से दे की धारा 15.12.2.5 कैसे चयन करने के लिए

सबसे विशिष्ट विधि संकलन समय

[शून्य पैरामीटर के लिए विधि ओवरलोडिंग] की