2013-05-31 12 views
7
class Parent 
{ 
    private void method1() 
    { 
     System.out.println("Parent's method1()"); 
    } 
    public void method2() 
    { 
     System.out.println("Parent's method2()"); 
     method1(); 
    } 
} 
class Child extends Parent 
{ 
    public void method1() 
    { 
     System.out.println("Child's method1()");   
    } 

    public static void main(String args[]) 
    { 
     Child p = new Child(); 
     p.method2(); 
    } 
} 

ansक्यों विरासत उत्पादन अप्रत्याशित है

Parent's method2() 
Parent's method1() 

है मैं बाल वर्ग तो क्यों उत्पादन माता पिता वर्ग विधि की है की वस्तु बनाने हूं, तो क्या ?? यहां तक ​​कि method1 माता-पिता में निजी है। यह मेरी सभी विरासत अवधारणा को हिलाता है।

उत्तर

13

यदि यह मूल विधि को ओवरराइड करता है तो यह बाल विधि को कॉल करेगा। लेकिन ऐसा नहीं है, क्योंकि मूल विधि निजी है, और इस प्रकार इसे ओवरराइड नहीं किया जा सकता है।

जब आपका इरादा किसी क्लासिक क्लास या इंटरफ़ेस से किसी विधि को ओवरराइड करना है, तो आपको हमेशा @Override के साथ विधि को एनोटेट करना चाहिए। यदि आपने किया, तो इस मामले में, आपको कंपाइलर से एक त्रुटि मिलेगी, क्योंकि बच्चे की विधि 1 किसी विधि को ओवरराइड नहीं करती है।

जब मूल वर्ग संकलित किया जाता है, तो संकलक अभिभावक वर्ग में विधि 1 की तलाश करता है। यह पाता है, और देखता है कि यह निजी है। चूंकि यह निजी है, यह जानता है कि यह किसी भी उप-वर्ग द्वारा अतिसंवेदनशील नहीं है, और इस प्रकार विधिवत विधि को उस विधि को बाध्य करता है जो उसे मिली है।

यदि विधि 1 संरक्षित या सार्वजनिक था, तो कंपाइलर को विधि मिल जाएगी, और पता चलेगा कि विधि को सबक्लास द्वारा ओवरराइड किया जा सकता है। तो यह विधिवत रूप से विधि से बंधे नहीं होगा। इसके बजाए, यह बाइटकोड उत्पन्न करेगा जो कंक्रीट क्लास में रनटाइम पर विधि 1 की तलाश करेगा, और फिर आप जिस व्यवहार की अपेक्षा करेंगे उसे प्राप्त करेंगे।

इसके बारे में सोचें: यदि कोई सबक्लास एक निजी विधि को ओवरराइड कर सकता है, तो विधि अब निजी नहीं होगी।

+0

हाँ मुझे पता है। लेकिन मैं बाल वर्ग की वस्तु बना रहा हूं। –

+0

@ankitagahoi मुझे आपके कथन में "लेकिन" बिंदु नहीं दिख रहा है :) –

+0

यदि यह बाल वर्ग वस्तु है और बाल वर्ग में विधि 1 है तो यह ओवरराइडिंग का मामला नहीं है। बाल पी = नया बच्चा(); –

1

निजी सदस्यों को बाल कक्षाओं द्वारा विरासत में नहीं मिला है। इसलिए आप सबक्लास में पूरी तरह से स्वतंत्र public void method1 परिभाषित कर रहे हैं। स्वाभाविक रूप से, यह गतिशील प्रेषण में भाग नहीं लेता है।

2

डिफ़ॉल्ट बाल वर्ग द्वारा मूल विधि तक पहुंच होगी। आप p.method2() ... को कॉल कर रहे हैं जो कि बाल वर्ग में मौजूद नहीं है, इसलिए यह माता-पिता से निष्पादित हो रहा है ...

हालांकि विधि 1() निजी है माता-पिता .. इसे स्थानीय विधि से बुलाया जा रहा है यानी method2() ... तो method1() को method2() में पहुंच मिली है ...

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