2013-02-25 13 views
6

मान लीजिए मैं निम्नलिखित वर्गोंजावा विधि के साथ कास्टिंग कॉल

class A{ 
    public method(A a) { 
     System.out.println(3); 
    } 
} 

class B extends A{ 
    public void method (A a) { 
     System.out.println(2); 
    } 
    public void method (B b) { 
     System.out.println(1); 
    } 
} 

A obj = new B(); 
obj.method((B) obj); 
((B) obj).method((B) obj); 

पहली विधि कॉल प्रिंट बाहर 2 दूसरी विधि कॉल प्रिंट बाहर 1. क्यों दोनों विधि बाहर प्रिंट 1 कॉल नहीं है, जबकि?

+0

ध्यान दें कि कोड संकलित नहीं होगा। –

उत्तर

3

क्योंकि जावा संकलन समय में कॉल करने के लिए विधि का चयन करता है। और संकलक केवल एक असाइनमेंट के "बायीं ओर" खाते को ध्यान में रखता है।

तो जब आप A obj = new B() टाइप करते हैं तो संकलक केवल A वर्ग में विधियों को "देखता है"।

+0

खैर ... कंपाइलर केवल "देखता है" कि इस तरह के तरीकों को परिभाषित किया गया है, लेकिन ऑब्जेक्ट के तरीकों को कॉल करता है, जो इस मामले में कक्षा बी के हैं क्योंकि इसकी एक ही विधि के साथ एक ही विधि है। ऐसा इसलिए होता है क्योंकि जावा में सभी विधियां आभासी हैं। –

4

बी के void method (B b) अपनी मूल ए के लिए पूरी तरह से अज्ञात है

यह तार्किक है, क्योंकि obj.method((B) obj); में, obj के प्रकार बहुरूपता शासन में एक जो यह सिर्फ वर्ग बी के void method(A a) संस्करण कॉल कर सकते हैं है

class B extends A { 

    // This is an overridden method visible to A 
    public void method(A a) { 
     System.out.println(2); 
    } 

    // This is an overloaded method unknown from A 
    public void method(B b) { 
     System.out.println(1); 
    } 
} 

You can read this SO answer which explained Override vs. Overload.

1

पहली विधि कॉल ग्रुप ए की वस्तु संदर्भ का उपयोग किया जाता है, तो इसी विधि है, जो अधिरोहित जा सकता है, कहा जाता है ।

दूसरे मामले में पहले डाली बी टाइप करने के लिए किया जाता है, तो विधि वर्ग बी में परिभाषित इसी, यानी,

method (B b) 

कहा जाता है।