कल मेरे पास दो घंटे का तकनीकी फोन साक्षात्कार था (जो मैंने पास किया, 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()
तरीका लागू करेगा ), डायनेमिक बाइंडिंग को संदर्भ के तात्कालिक प्रकार के आधार पर विधि के सबसे विशिष्ट संस्करण को लागू करने का ध्यान रखना चाहिए । मैं क्या खो रहा हूँ?