कल मेरे पास दो घंटे का तकनीकी फोन साक्षात्कार था (जिसे मैंने पास किया, woohoo!), लेकिन मैंने जावा में गतिशील बाध्यकारी के संबंध में निम्नलिखित प्रश्नों को पूरी तरह से मफ किया। और यह दोगुना परेशान है क्योंकि मैं कुछ साल पहले टीए था जब मैं इस अवधारणा को स्नातक के लिए पढ़ाना चाहता था, इसलिए संभावना है कि मैंने उन्हें गलत जानकारी दी है ...जावा गतिशील बाध्यकारी और विधि ओवरराइडिंग
यहां दी गई समस्या है:
/* What is the output of the following program? */
public class Test {
public boolean equals(Test other) {
System.out.println("Inside of Test.equals");
return false;
}
public static void main(String [] args) {
Object t1 = new Test();
Object t2 = new Test();
Test t3 = new Test();
Object o1 = new Object();
int count = 0;
System.out.println(count++);// prints 0
t1.equals(t2) ;
System.out.println(count++);// prints 1
t1.equals(t3);
System.out.println(count++);// prints 2
t3.equals(o1);
System.out.println(count++);// prints 3
t3.equals(t3);
System.out.println(count++);// prints 4
t3.equals(t2);
}
}
मैं ने कहा कि उत्पादन ओवरराइड equals()
विधि के भीतर से दो अलग-अलग प्रिंट बयान किया जाना चाहिए था: t1.equals(t3)
और t3.equals(t3)
पर। बाद वाला मामला पर्याप्त स्पष्ट है, और पूर्व मामले के साथ, भले ही t1
में ऑब्जेक्ट का एक संदर्भ है, इसे टाइप टेस्ट के रूप में तत्काल किया जाता है, इसलिए गतिशील बाध्यकारी विधि के ओवरराइड फॉर्म को कॉल करना चाहिए।
स्पष्ट रूप से नहीं। मेरे साक्षात्कारकर्ता ने मुझे प्रोग्राम चलाने के लिए प्रोत्साहित किया, और देखो और देखें, ओवरराइड विधि से केवल एक ही आउटपुट था: लाइन t3.equals(t3)
पर।
मेरा प्रश्न तब है, क्यों? जैसा कि मैंने पहले ही उल्लेख किया है, भले ही t1
ऑब्जेक्ट का एक संदर्भ है (इसलिए स्थिर बाध्यकारी ऑब्जेक्ट की equals()
विधि का आह्वान करेगा), गतिशील बाध्यकारी संदर्भ के तत्काल प्रकार के आधार पर विधि के सबसे विशिष्ट संस्करण को आविष्कार करने का ख्याल रखना चाहिए। मैं क्या खो रहा हूँ?
कृपया इस जवाब देने के लिए अपनी पोस्ट को खोजने जहां मैं अपना सर्वश्रेष्ठ प्रयास किया है अतिरिक्त मामलों के साथ व्याख्या करने के लिए। मैं वास्तव में आपके इनपुट की सराहना करता हूं :) –