2012-05-01 11 views
10

मैं एक एपी जावा छात्र हूं और मैं अपनी परीक्षा के लिए अभ्यास कर रहा हूं। मैं इस सवाल में आए और मैं इस सवाल का जवाब समझ में नहीं आता:पॉलिमॉर्फिज्म और कन्स्ट्रक्टर्स

निम्नलिखित वर्गों पर विचार करें:

public class A 
{ 
    public A() { methodOne(); } 

    public void methodOne() { System.out.print("A"); } 
} 

public class B extends A 
{ 
    public B() { System.out.print("*"); } 

    public void methodOne() { System.out.print("B"); } 
} 

क्या उत्पादन जब निम्न कोड निष्पादित है:

A obj = new B(); 

सही जवाब बी * है। क्या कोई मुझे विधि कॉल के अनुक्रम की व्याख्या कर सकता है?

+0

'ए' के निर्माता को एक प्रिंट स्टेटमेंट जोड़ें, और यह स्पष्ट हो सकता है। –

उत्तर

27

बी कन्स्ट्रक्टर कहा जाता है। बी कन्स्ट्रक्टर का पहला निहित निर्देश super() है (सुपर क्लास के डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल करें)। तो ए के निर्माता कहा जाता है। ए के कन्स्ट्रक्टर super() पर कॉल करता है, जो java.lang.Object कंस्ट्रक्टर को आमंत्रित करता है, जो कुछ भी प्रिंट नहीं करता है। फिर methodOne() कहा जाता है। चूंकि ऑब्जेक्ट बी प्रकार का है, बी 0 का संस्करण methodOne कहा जाता है, और B मुद्रित होता है। फिर बी कन्स्ट्रक्टर निष्पादन जारी है, और * मुद्रित है।

यह ध्यान दिया जाना चाहिए कि एक कन्स्ट्रक्टर (जैसे ए के कन्स्ट्रक्टर करता है) से एक अतिरंजित विधि को कॉल करना बहुत बुरा अभ्यास है: यह किसी ऑब्जेक्ट पर एक विधि को कॉल करता है जो अभी तक नहीं बनाया गया है।

+4

+1, खासकर खराब अभ्यास बिट के लिए। –

+0

और, ओवरडॉइड विधि 'क्लास ए' के ​​तरीके की अपेक्षा नहीं कर सकती है। –

+0

मुझे सुपर() धन्यवाद के लिए निहित कॉल के बारे में पता नहीं था! – user1104775

2

बेस क्लास व्युत्पन्न कक्षा से पहले बनाया जाना चाहिए।

पहले A() को कॉल किया जाता है जिसे methodOne() कहते हैं जो B प्रिंट करता है।

अगला, B() कहा जाता है कि कौन से प्रिंट * हैं।

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