2013-01-01 11 views
6

संभव डुप्लिकेट:
The concept of shadowingजब जावाकास्ट करते समय जावा फ़ील्ड को कैसे संभालता है?

मैं कैसे कक्षाओं के क्षेत्र upcasting दौरान जावा में नियंत्रित किया जाता है के बारे में उलझन में हूँ। उदाहरण के लिए:

class SuperClass 
{ 
    String myString = "String in SuperClass"; 

    public void myMethod() 
    { 
     System.out.println("Method in SuperClass"); 
    } 
} 

class SubClass extends SuperClass 
{ 
    String myString = "String in SubClass"; 

    public void myMethod() 
    { 
     System.out.println("Method in SubClass"); 
    } 
} 

class Question 
{ 
    public static void main(String[] args) 
    { 
     SuperClass test = new SubClass(); 
      // object test is an instance of SubClass 
      // but I am telling the compiler to treat it as SuperClass 

     test.myMethod(); 
     System.out.println(test.myString); 

    } 
} 

आउटपुट:

Method in SubClass 
String in SuperClass //Why is "String in SubClass" not used? 

यह SubClass वर्ग का एक उदाहरण है जब मैं एक वस्तु test बनाएँ; हालांकि, मैं संकलक को SuperClass के रूप में पेश करने के लिए कह रहा हूं। विधियों के काम के बारे में सबकुछ मुझे स्पष्ट है: यदि SuperClass के लिए दी गई विधि को परिभाषित किया गया है, तो मैं केवल SubClass के तरीकों का उपयोग करने में सक्षम हूं।

हालांकि, SuperClass का एक क्षेत्र क्यों उपयोग किया जाता है जब मैं test तक पहुंचने का प्रयास करता हूं। चूंकि testSubClass का एक उदाहरण है I myStringSubClass में परिभाषित होने की अपेक्षा की जाएगी, ऐसा क्यों नहीं हो रहा है? मैं क्या खो रहा हूँ?

मुझे पता है कि मैं का माइस्ट्रिंग this ऑपरेटर का उपयोग करके एक्सेस कर सकता हूं। उदाहरण के लिए, मैं सुपर क्लास में printMyString विधि निर्धारित कर सकते हैं, और

public void printMyString() 
{ 
    System.out.println(this.myString); 
} 

SubClass में से अधिलेखित है, तो मेरे सवाल का ज्यादातर कैसे आ SuperClass के क्षेत्र test में प्रयोग किया जाता है के बारे में है। शायद मुझे कुछ याद आ रही है?

मैंने जवाब खोजने की कोशिश की, और मुझे मिला सबसे नज़दीकी विषय Upcasting in Java and two separate object properties था, हालांकि मददगार, यह मेरे प्रश्न का उत्तर नहीं दिया।

अग्रिम में धन्यवाद

+0

अच्छा सवाल @Akavall –

उत्तर

7

गुणों को विधियों की तरह ओवरलोड नहीं किया जा सकता है।

test.myMethod(); 

यहाँ विधि मंगलाचरण वास्तविक वस्तु की प्रकार पर निर्भर करता है। यहां ऑब्जेक्ट SubClass प्रकार है इसलिए SubClass की विधि लागू की गई है।

test.myString 

विशेषताओं एक्सेस करते हुए, यह संदर्भ चर की प्रकार पर निर्भर करता है। यहां संदर्भ चर यानी test प्रकार SuperClass है इसलिए SuperClass से विशेषता का उपयोग किया जाता है।

आप जो देख रहे हैं वह class variable hiding/shadowing है।

+0

अच्छा लिंक, धन्यवाद। मुख्य भाग यह है: "जब एक उप-वर्ग में एक आवृत्ति परिवर्तक एक सुपर क्लास में एक आवृत्ति चर के समान नाम होता है, तो संदर्भ चर क्लास में चुना जाता है जो संदर्भ प्रकार है।" – Akavall

+0

@ अक्कवाल: हां आपने बिंदु मारा :) – xyz

3

जावा में फ़ील्ड्स केवल छिपे हुए हैं और वास्तव में पर ओवरराइड नहीं किए गए हैं (इसका मतलब यह नहीं है कि हम कोशिश करते समय संकलन समय त्रुटि प्राप्त करेंगे, इसके बजाय वे इसकी वास्तविक अर्थ में ओवरराइड नहीं हैं)।

अधिभावी का मतलब सदस्य वस्तु और नहीं घोषित प्रकार के आधार पर की रन टाइम प्रकार के आधार पर लागू किया जाना चाहिए।

लेकिन जावा में क्षेत्रों के लिए बाध्यकारी हमेशा स्थिर है और इसलिए यह वस्तु संदर्भ केवल की घोषित प्रकार के आधार पर है।

उदाहरण में आप कक्षा में नाम 'myString' के साथ वर्ग चर घोषित करने SubClass आप वर्ग चर यह एक ही नाम 'myString' के साथ अपने सुपर क्लास SuperClass से विरासत में मिली है | छिपाने द्वारा दिया है,।

जावा भाषा विनिर्देश:

वर्ग एक निश्चित नाम के साथ एक क्षेत्र वाणी है, तो उस क्षेत्र के घोषणा सुपर-क्लास में एक ही नाम के साथ क्षेत्रों के किसी भी और सभी सुलभ घोषणाओं को छिपाने के लिए कहा जाता है , और कक्षा के superinterfaces।

एक छिपे हुए क्षेत्र को एक योग्य नाम का उपयोग करके या स्थिर क्षेत्र का उपयोग करके एक्सेस किया जा सकता है जिसमें कीवर्ड सुपर या सुपरक्लास प्रकार के लिए कलाकार शामिल है।

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