2012-12-31 15 views
5

मैंने इसी तरह के प्रश्न के लिए ऑनलाइन खोज की, लेकिन इसे नहीं मिला। तो, यहां पोस्टिंग।जावा विरासत - यह कीवर्ड

निम्नलिखित प्रोग्राम में 'i' का मान 100 के रूप में क्यों मुद्रित किया गया है?

AFAIK 'यह' वर्तमान वस्तु को संदर्भित करता है; जो इस मामले में 'टेस्ट चाइल्ड' है और वर्ग का नाम भी सही ढंग से मुद्रित है। लेकिन क्यों आवृत्ति चर का मूल्य 200 नहीं है?

public class TestParentChild { 
    public static void main(String[] args) { 
     new TestChild().printName(); 
    } 
} 

class TestChild extends TestParent{ 
    public int i = 200; 
} 

class TestParent{ 
    public int i = 100; 
    public void printName(){ 
     System.err.println(this.getClass().getName()); 
     System.err.println(this.i); //Shouldn't this print 200 
    } 
} 

और इसके अलावा निम्न के आउटपुट की अपेक्षा की जाती है। बाल वर्ग विधि का आह्वान किया जाता है, जब मैं "यह.test()" अभिभावक वर्ग से "कॉल करता हूं।

public class TestParentChild { 
    public static void main(String[] args) { 
     new TestChild().printName(); 
    } 
} 

class TestChild extends TestParent{ 
    public int i = 200; 
    public void test(){ 
     System.err.println("Child Class : "+i); 
    } 

} 

class TestParent{ 
    public int i = 100; 
    public void printName(){ 
     System.err.println(this.getClass().getName()); 
     System.err.println(this.i); //Shouldn't this print 200 
     this.test(); 
    } 
    public void test(){ 
     System.err.println("Parent Class : "+i); 
    } 
} 

उत्तर

7

जावा आभासी खेतों नहीं है, तो printName में i क्षेत्र हमेशा और नहीं TestParent.i को संदर्भित करता है किसी भी वंशज बच्चे। जावा में विरासत के माध्यम से

बहुरूपता केवल तरीकों के साथ होता है, इसलिए यदि आप चाहते हैं व्यवहार आप तो वर्णन कर रहे हैं तो आप इस चाहते हैं:

class TestChild extends TestParent{ 

    private int i = 200; 

    @Override 
    public int getI() { return this.i; } 
} 

class TestParent{ 

    private int i = 100; 

    public int getI() { return this.i; } 

    public void printName(){ 
     System.err.println(this.getClass().getName()); 
     System.err.println(this.getI()); // this will print 200 
    } 
} 
+0

त्वरित प्रतिक्रिया के लिए धन्यवाद । क्या आप कृपया प्रसन्न हो सकते हैं, इसका मतलब क्या है? ** "जावा फ़ील्ड में आभासी के रूप में चिह्नित नहीं किया जा सकता" ** जैसा कि मैंने उल्लेख किया है, मेरे दूसरे कार्यक्रम में इंस्टेंस विधि सही ढंग से लागू की जाती है। लेकिन इंस्टेंस वैरिएबल अभिभावक वर्ग का जिक्र कर रहा है। – Jack

+0

मैंने अपना जवाब अपडेट कर दिया है। – Dai

+1

जावा में, सभी विधियां (जब तक निर्दिष्ट नहीं) "आभासी" हैं, जिसका अर्थ है कि उनके पास एक संबंधित vtable है जो रनटाइम प्रेषण की अनुमति देता है। फ़ील्ड, हालांकि, एक पूर्ण- (आईएसएच) स्मृति स्थान के रूप में मौजूद हैं और किसी भी vtable द्वारा ऑफसेट नहीं हैं। मैं जावा के डिज़ाइन दस्तावेज़ पर भ्रम को दोषी ठहराता हूं जिसमें स्पष्ट "वर्चुअल" और "ओवरराइड" कीवर्ड नहीं हैं जबकि सी # करता है। – Dai

2

क्योंकि जावा में खेतों नहीं ली गई है। अपनी घोषणाओं का उपयोग करके, आपने प्रभावी ढंग से दो विभिन्न फ़ील्ड i नामित फ़ील्ड घोषित कर दिए हैं, और TestChild के उदाहरण दोनों होंगे। जब TestParent संकलित किया गया है, तो इसके तरीकों में i के संदर्भ हमेशा TestParent.i देखेंगे।

+2

फ़ील्ड विरासत में हैं, बस ओवरराइड नहीं हैं। – Dai

+0

निश्चित रूप से, यह बेहतर phrasing है। – Dolda2000

2

कक्षा चर को ओवरराइड करने का कोई तरीका नहीं है।

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

उदाहरण के उदाहरण में, कक्षा TestChild में क्लास वैरिएबल को 'i' नाम से घोषित करके आपने क्लास वैरिएबल को छुपाया है, इसे उसी सुपरक्लास TestParent से उसी नाम 'i' से विरासत में मिला होगा। इस तरह से एक चर छिपाई जा रही है वर्ग चर 'i' सुपर क्लास TestParent

में वांछित व्यवहार प्राप्त करने के लिए की मूल्य को प्रभावित नहीं करता, तो आप सिर्फ getI() विधि ओवरराइड कर सकते हैं

class TestChild extends TestParent{ 

    private int i = 200; 

    @Override 
    public int getI() { 
     return this.i; 
    } 
} 
+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। मैंने छुपा (छायांकन) के बारे में पढ़ा था, लेकिन इसके बारे में भूल गया। :(फिर से धन्यवाद। – Jack

+0

आपका स्वागत है :) – Rahul

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