2013-07-16 7 views
21

जिज्ञासा से बाहर मैंने इस उदाहरण की कोशिश की।जावा ऑब्जेक्ट/स्ट्रिंग विधि ओवरलोड

public class Class1 { 

    public void method(Object obj){ 
     System.out.println("Object"); 
    } 

    public void method(String str){ 
     System.out.println("String"); 
    } 

    public static void main(String... arg){ 
     new Class1().method(null); 
    } 

} 

आउटपुट "स्ट्रिंग" है। मैं जानना चाहता हूं कि जेवीएम किस प्रकार स्ट्रिंग को तर्क के रूप में लेने के लिए विधि का आह्वान करने का निर्णय लेता है, न कि ऑब्जेक्ट।

+0

क्या यह एक संकलन त्रुटि नहीं है? अस्पष्ट मानकों के बारे में कुछ? – Thilo

+0

स्पष्ट रूप से नहीं। काश ये होता। – Thilo

+0

इस बारे में कुछ भी अस्पष्ट नहीं है, @ थिलो। अगर पहली विधि 'इंटेगर' और दूसरी 'स्ट्रिंग' को स्वीकार कर लेती है तो यह संदिग्ध होगा, तब से उनमें से कोई भी दूसरे की तुलना में "अधिक विशिष्ट" नहीं होगा। – Joni

उत्तर

14

जब भी एक से अधिक अतिभारित तरीकों तर्क सूची के लिए लागू किया जा सकता है, सबसे विशिष्ट विधि प्रयोग किया जाता है से विधि के लिए खोज करेंगे।

इस मामले में किसी भी विधि का जब null गुजर, "शून्य प्रकार" के बाद से कहा जा सकता है दोनों Object करने और String को आबंटित है। String ले जाने वाली विधि अधिक विशिष्ट है इसलिए इसे चुना जाएगा।

+0

मैं कम से कम विशिष्ट विधि कैसे कॉल कर सकता हूं ?? –

+0

प्रकार का उपयोग करें। उदाहरण के लिए, 'विधि ((ऑब्जेक्ट) शून्य) ' – Joni

+0

मैं अब इसका उपयोग करता हूं। लेकिन मान लें कि मैं इस विधि का उपयोग पुस्तकालय की एक उजागर विधि के रूप में कर रहा हूं। इसलिए मैं नहीं चाहता कि उपयोगकर्ता इस प्रकार के कास्टिंग और सब कुछ करे। उपयोगकर्ता सिर्फ मूल्य पास करेगा और मुझे प्रोग्राम को विधिवत रूप से उचित विधि पर रीडायरेक्ट करना होगा। क्या कोई और तरीका है ? @joni –

10

जब भी वहाँ विधि ओवरलोडिंग, JVM सबसे विशिष्ट प्रकार कम से कम विशिष्ट प्रकार के

+2

मैं सुझाव देता हूं कि 'सबसे निकटतम' से 'सबसे विशिष्ट प्रकार' से अपना उद्धरण संपादित करना प्रोग्रामिंग लैंग के संदर्भ में अधिक उपयुक्त होगा। – exexzian

+0

मेड सुधार। उसके लिए धन्यवाद। मेरा मतलब वही था, हालांकि आपके शब्द अधिक समझ में आते हैं। – Reddy

+3

यह संकलक है जो तय करता है कि कौन सी विधि को बुलाया जाना चाहिए, JVM नहीं। – Joni

0

का मामला becaue आप विधि बुला में अशक्त से गुजर रहे हैं और आप शून्य परिभाषित विधि (स्ट्रिंग स्ट्र) और स्ट्रिंग हमेशा शून्य के साथ initlize। यह मिल जाएगा parametrized विधि मिलान। Thats y आपको कंसोल पर "str" ​​मिला है।

2

जावा कंपाइलर सबसे विशिष्ट विधि चुनता है।

स्ट्रिंग एक अधिक विशिष्ट प्रकार वस्तु की तुलना में है।

0

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

0

यह विधि

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

'java.lang.String' 'java.lang.Object' से अधिक विशिष्ट प्रकार है। आपके मामले में यह स्ट्रिंग देता है।

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