2013-02-18 19 views
9

मैं जावा सीख रहा हूं। मुझे विरासत में संदेह है। जब कोई बच्चा वर्ग अभिभावक वर्ग और अभिभावक वर्ग को बढ़ाता है तो एक विधि होती है जो माता-पिता में घोषित एक आवृत्ति चर को संदर्भित करती है। लेकिन बाल वर्ग डिन इस विधि को ओवरराइड करता है और माता-पिता के समान नाम के साथ इंस्टेंस वैरिएबल घोषित करता है। इस मामले में बच्चे से इंस्टेंस वैरिएबल का उल्लेख किया जाएगा या माता-पिता को संदर्भित किया जाएगा। नीचे दिए कोड स्निपेट हैजावा विरासत ओवरराइडिंग आवृत्ति चर

class parent { 
    int a; 
    parent() { 
     System.out.println("in parent"); 
     a = 10; 
    } 
    void method() { 
     System.out.println(a); 
    } 
} 
class child extends parent { 
    int a; 
    child() { 
     System.out.println("in child"); 
     a = 11; 
    } 
} 

public class Test { 
    public static void main(String args[]) throws IOException { 
     parent p1 = new child(); 
     p1.method(); 
    } 
} 

उत्पादन मैं माता-पिता में

है
बच्चे में

कोई मुझे समझाने कृपया कारण है कि इसकी चर्चा करते हुए माता-पिता वर्ग के उदाहरण चर a और बाल वर्ग का a नहीं।

एक और संदेह यह है कि, मैं विधि को छिपाने में समझ गया, जब माता-पिता और बाल वर्ग में एक स्थैतिक विधि भी एक ही हस्ताक्षर के साथ एक स्थिर विधि घोषित कर दी गई है। यहां छुपा मतलब है? कौन सी विधि छिपी जा रही है? यदि आप माता-पिता की विधि कृपया मुझे समझा सकते हैं?
अग्रिम धन्यवाद।

+2

क्या आप सुनिश्चित हैं कि आपका कोड भी संकलित करता है? क्या आपने अपना कोड चलाया है? –

+1

यह संकलित नहीं होना चाहिए, माता-पिता के पास कोई विधि नहीं है विधि() ' –

+0

क्षमा करें कि गलत तरीके से स्वरूपित किया गया था। अब कोड अपडेट किया गया। – Mojoy

उत्तर

17
  1. जावा उदाहरण चर एक उपवर्ग में ओवरराइड नहीं किया जा सकता है। जावा विरासत उस तरह से काम नहीं करता है।

  2. आपके उदाहरण में, कोई विधि छुपा नहीं है (या ओवरराइडिंग या ओवरलोडिंग) चल रहा है।

  3. हालांकि आवृत्ति चर के छिपे हुए हैं। वर्ग child में, a की घोषणा parent में a की घोषणा, और child कक्षा में a के सभी संदर्भ नहीं child.aparent.a का उल्लेख छुपाता है।

अधिक स्पष्ट रूप से यह समझाने के लिए, यह चलाने की कोशिश:

public static void main(String args[]) throws IOException { 
    child c1 = new child(); 
    parent p1 = c1; 

    System.out.println("p1.a is " + p1.a); 
    System.out.println("c1.a is " + c1.a); 
    System.out.println("p1 == c1 is " + (p1 == c1)); 
} 

यह चाहिए उत्पादन:

p1.a is 10 
    c1.a is 11 
    p1 == c1 is true 

यह प्रदर्शित करता है कि दो अलग-अलग a बुलाया क्षेत्रों के साथ एक वस्तु है कि वहाँ .. और यदि पहुंच प्रवेश की अनुमति देती है, तो आप उनके दोनों मूल्यों को पकड़ सकते हैं।


अंत में, आपको मानक जावा पहचानकर्ता सम्मेलनों का पालन करना सीखना चाहिए। एक वर्ग का नाम हमेशा पूंजी पत्र से शुरू होना चाहिए।

2

Instance variables are not overriden in sub-class। यदि आप अपनी कक्षा में एक वैरिएबल को अपने सुपर क्लास के समान नाम से परिभाषित करते हैं तो इसे चर के छायांकनinheretence and polymorphism उदाहरण चर के लिए लागू नहीं होता है। यदि आप माता-पिता में विधि() को परिभाषित करते हैं और इसे बाल वर्ग में ओवरराइड करते हैं। नीचे दिए गए आह्वान हैं बच्चे की विधि() की वजह से रन-टाइम बहुरूपता मुद्रण

parent p1 = new child(); 
  1. बाल निर्माता
  2. invokes सुपर() कॉल आह्वान के माता-पिता के निर्माता के साथ करने के लिए
  3. प्रिंट के "माता-पिता में "और बच्चे में 10
  4. प्रिंट के लिए अभिभावक का एक initializes और initializes Chils एक 11

    p1.method();// this invokes Child's method() during run-time 
    
0

मुद्दा यह है कि आपने एक बाल उदाहरण बनाया है और इसे माता-पिता के संदर्भ में संग्रहीत किया है। इसलिए, जब आप ऑब्जेक्ट की संपत्ति तक पहुंचते हैं, तो JVM माता-पिता के चर मूल्य को संदर्भित करता है।

यदि यह एक बाल वर्ग के संदर्भ चर होता, तो आपको बाल वर्ग 'परिवर्तनीय मान प्राप्त होता।

उपर्युक्त जावा की एक विशेषता है।

0

जब आप अभिभावक का उदाहरण बनाते हैं। इसलिए रन टाइम में कंपाइलर पैरेंट ऑब्जेक्ट को कॉल करता है, नीचे कोड आज़माएं।

public static void main(String args[]) throws IOException { 
    child c1 = new child(); 
    c1.method(); 
} 
1

आप इस

जनक पी 1 = नए बाल() करते हैं;

JVM करना क्या

   first Initialize Parent() 

         || 

       second Initialize Child() 

तो, पहले जनक निर्माता कहा जाता हो और उसके बाद बच्चे की है, लेकिन उत्पादन मूल्य 11 हो जाएगा, क्योंकि p1 बच्चे की वस्तु के लिए बात कर रहा है।

1

आप बच्चे को वर्ग, जब बयान में विधि(),

parent p1 = new child(); 

निष्पादित किया जाता है, विधि की मूल संस्करण (अधिभावी के रूप में नहीं कर रहे हैं) निष्पादित किया जाएगा, और केवल एक माता पिता के वर्ग के लिए जाना जाता है मूल्य इसका अपना ए। इसलिए यह एक = 10 मुद्रित करेगा (क्योंकि यह उस समय ढेर पर है)।

आखिरकार, आप वैरिएबल क्लास से लेकर बाल वर्ग तक परिवर्तनीय छायांकन कर रहे हैं।

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