मैंने इसी तरह के प्रश्न के लिए ऑनलाइन खोज की, लेकिन इसे नहीं मिला। तो, यहां पोस्टिंग।जावा विरासत - यह कीवर्ड
निम्नलिखित प्रोग्राम में '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);
}
}
त्वरित प्रतिक्रिया के लिए धन्यवाद । क्या आप कृपया प्रसन्न हो सकते हैं, इसका मतलब क्या है? ** "जावा फ़ील्ड में आभासी के रूप में चिह्नित नहीं किया जा सकता" ** जैसा कि मैंने उल्लेख किया है, मेरे दूसरे कार्यक्रम में इंस्टेंस विधि सही ढंग से लागू की जाती है। लेकिन इंस्टेंस वैरिएबल अभिभावक वर्ग का जिक्र कर रहा है। – Jack
मैंने अपना जवाब अपडेट कर दिया है। – Dai
जावा में, सभी विधियां (जब तक निर्दिष्ट नहीं) "आभासी" हैं, जिसका अर्थ है कि उनके पास एक संबंधित vtable है जो रनटाइम प्रेषण की अनुमति देता है। फ़ील्ड, हालांकि, एक पूर्ण- (आईएसएच) स्मृति स्थान के रूप में मौजूद हैं और किसी भी vtable द्वारा ऑफसेट नहीं हैं। मैं जावा के डिज़ाइन दस्तावेज़ पर भ्रम को दोषी ठहराता हूं जिसमें स्पष्ट "वर्चुअल" और "ओवरराइड" कीवर्ड नहीं हैं जबकि सी # करता है। – Dai