2015-11-02 4 views
5
class A {int x = 5;} 
class B extends A {int x = 10;} 
class D { 
    public static void main(String[] args){ 
     A b0 = new B(); 
     System.out.print(b0.x); 
    } 
} 

मैं सोच रहा हूँ क्यों इस कोड प्रिंट 5 10.स्टेटिक उदाहरण चर लुक जावा

अगर मैं बजाय निम्नलिखित लिखने के बजाय, चर परिवर्तित एक्स तरीकों की, यह काम करता है और अधिक के रूप में मैं उम्मीद थी, और 10 प्रिंट करता है, क्योंकि संकलन समय पर यह केवल तभी चेक किया जाता है जब बी 0 के स्थिर प्रकार, ए, में एक विधि x है, और फिर रनटाइम पर, x चलाने के लिए बी 0 के गतिशील प्रकार, बी का उपयोग करता है।

class A {int x() {return 5;}} 
class B extends A {int x() {return 10;}} 
class D { 
    public static void main(String[] args){ 
     A b0 = new B(); 
     System.out.print(b0.x()); 
    } 
} 

मेरे सिद्धांत यह है कि उदाहरण चर स्थिर तरीकों के विपरीत ऊपर देखा जाता है, लेकिन मैं के बारे में क्यों है कि हो सकता है यकीन नहीं है।

धन्यवाद!

उत्तर

4

BA से क्षेत्र छायांकित (छुपा हुआ) अतिप्रवाह नहीं है। here और here दस्तावेज़ों के संदर्भ में "ऐसा क्यों होगा" का जवाब देना। कंपाइलर x के 2 उदाहरणों में से एक को ऑब्जेक्ट के प्रकार के अनुसार चुन देगा। और b0 प्रकार A

A b0 = new B(); 

जब आप (गेटर) दूसरी तरफ तरीकों माता पिता वर्ग में समान हस्ताक्षर से इन तरीकों ओवरराइड कर सकते हैं परिभाषित की है। एक और बुरा आश्चर्य यह है कि माता-पिता वर्ग में एक क्षेत्र छायांकित होता है भले ही यह एक अलग प्रकार है।

सदस्यों की छाया को खराब अभ्यास माना जाता है क्योंकि यह डेवलपर्स को भ्रमित करता है।

4

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

A b0 = new B(); 
System.out.print(((B)b0).x); 

एक टाइपकास्ट का उपयोग कर आप अब वर्ग B से चर x ऐक्सेस कर रहे होंगे।

अधिक जानकारी के लिए आप पढ़ सकता है के माध्यम से JLS 8.3

3

स्टेटिक क्षेत्रों इनहेरिट नहीं होते, वे एक दूसरे को ओवरराइड नहीं करते वे एक दूसरे को शैडो। जब आप सीधे अपने मामले में उसी नाम के स्टेटिक फ़ील्ड तक पहुंचते हैं, तो सुपरक्लास का क्षेत्र दूसरे क्षेत्र को छुपाता है और आपके पास दो int Xes हैं लेकिन सुपरक्लास में से एक छुपा नहीं है और उठाया जाता है। अभी भी बेहतर है, जब आप एक ही विधि का एक और उदाहरण कहते हैं और उसी स्थिर क्षेत्र तक पहुंचते हैं, तब वह चीजें बहुत अजीब होती हैं। स्थिर क्षेत्रों को एक साथ जोड़ दिए जाते हैं और आप एक्स जा रहा है 5 + 5 = 10.

दूसरी ओर के साथ खत्म हो सकता है, यदि आप सुपर क्लास से गैर स्थिर क्षेत्र के वारिस, वहाँ उप में विभिन्न मूल्य होने की कोई समस्या नहीं है वर्ग, क्योंकि उप-वर्ग गैर स्थैतिक सुपर सदस्य को ओवरराइड कर सकता है।

स्टेटिक चर और विरासत खराब है, यह बहुरूपता को तोड़ देता है जहां आप कम से कम इसकी अपेक्षा करेंगे। (असल में, यदि आप अपनी भाषा की अवधारणाओं को समझते हैं, तो आप इसकी अपेक्षा करते हैं, लेकिन अन्य लोग नहीं कर सकते हैं)

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