जैसा कि ओवरलोडिंग संकल्प से पहले उल्लेख किया गया है संकलन समय पर किया जाता है।
जावा गूढ़ व्यक्ति इसके लिए एक अच्छा उदाहरण है:
पहेली 46: कन्फ्यूजिंग कंस्ट्रक्टर का मामला
यह पहेली आपको दो कन्फ्यूजिंग कंस्ट्रक्टर के साथ प्रस्तुत करती है। मुख्य विधि एक निर्माता को आमंत्रित करती है, लेकिन कौन सा? कार्यक्रम का आउटपुट उत्तर पर निर्भर करता है। प्रोग्राम क्या प्रिंट करता है, या क्या यह कानूनी है?
public class Confusing {
private Confusing(Object o) {
System.out.println("Object");
}
private Confusing(double[] dArray) {
System.out.println("double array");
}
public static void main(String[] args) {
new Confusing(null);
}
}
समाधान 46: कन्फ्यूजिंग कंस्ट्रक्टर का मामला
... जावा की अधिभार संकल्प प्रक्रिया दो चरणों में संचालित होती है। पहला चरण उन सभी तरीकों या निर्माणकर्ताओं का चयन करता है जो सुलभ और लागू होते हैं। दूसरा चरण पहले चरण में चुने गए तरीकों या निर्माणकर्ताओं में से सबसे विशिष्ट का चयन करता है । एक विधि या कंस्ट्रक्टर दूसरे की तुलना में कम विशिष्ट है अगर यह किसी भी अन्य को पारित मापदंडों को स्वीकार कर सकता है [जेएलएस 15.12.2.5]।
हमारे कार्यक्रम में, दोनों निर्माणकर्ता सुलभ और लागू हैं। कंस्ट्रक्टर
कन्फ्यूज़िंग (ऑब्जेक्ट) कन्फ़्यूज़िंग (डबल []) को दिए गए किसी भी पैरामीटर को स्वीकार करता है , इसलिए
कन्फ़्यूज़िंग (ऑब्जेक्ट) कम विशिष्ट है। (हर एक डबल ऐरे एक ऑब्जेक्ट है , लेकिन हर ऑब्जेक्ट एक डबल ऐरे नहीं है ।) सबसे विशिष्ट कंस्ट्रक्टर इसलिए कन्फ्यूजिंग (डबल []) है , जो प्रोग्राम के आउटपुट को समझाता है।
यदि आप टाइप डबल [] का मान पास करते हैं तो यह व्यवहार समझ में आता है ; यदि आप शून्य से गुजरते हैं तो यह काउंटरिंटिटिव है । इस पहेली को समझने की कुंजी यह है कि किस विधि या निर्माता के लिए परीक्षण सबसे विशिष्ट है, वास्तविक मापदंडों का उपयोग नहीं करता है : आह्वान में दिखाई देने वाले पैरामीटर। उनका उपयोग केवल यह निर्धारित करने के लिए किया जाता है कि कौन से ओवरलोडिंग लागू हैं। एक बार कंपाइलर यह निर्धारित करता है कि कौन सा ओवरलोडिंग लागू और सुलभ है, यह केवल औपचारिक मापदंडों का उपयोग करके सबसे विशिष्ट ओवरलोडिंग का चयन करता है: घोषणा में प्रदर्शित होने वाले पैरामीटर।
एक अशक्त पैरामीटर के साथ कन्फ्यूज़िंग (ऑब्जेक्ट) कंस्ट्रक्टर को आमंत्रित करने के लिए , नया कन्फ़्यूज़िंग (ऑब्जेक्ट) नल लिखें । यह सुनिश्चित करता है कि केवल कन्फ्यूज़िंग (ऑब्जेक्ट) लागू हो। अधिक आम तौर पर, संकलक को एक विशिष्ट ओवरलोडिंग का चयन करने के लिए मजबूर करने के लिए, वास्तविक मापदंडों को औपचारिक प्रकारों के घोषित प्रकारों में डालना।