2012-09-03 25 views
6

कक्षा के भीतर, सुपरक्लस में एक फ़ील्ड के समान नाम वाला फ़ील्ड सुपरक्लास के क्षेत्र को छुपाता है।जावा विरासत में छिपे हुए फ़ील्ड

public class Test { 

    public static void main(String[] args) { 

     Father father = new Son(); 
     System.out.println(father.i); //why 1? 
     System.out.println(father.getI()); //2 
     System.out.println(father.j); //why 10? 
     System.out.println(father.getJ()); //why 10? 

     System.out.println(); 

     Son son = new Son(); 
     System.out.println(son.i); //2 
     System.out.println(son.getI()); //2 
     System.out.println(son.j); //20 
     System.out.println(son.getJ()); //why 10? 
    } 
} 

class Son extends Father { 

    int i = 2; 
    int j = 20; 

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

class Father { 

    int i = 1; 
    int j = 10; 

    public int getI() { 
     return i; 
    } 

    public int getJ() { 
     return j; 
    } 
} 

क्या कोई मेरे लिए परिणाम समझा सकता है?

+1

आपकी समझ के आधार पर छिपाने और विरासत का मतलब क्या है; आपको क्यों लगता है कि वे मूल्य किस तरह हैं? आप इसे अपने लिए बाहर करने में सक्षम होना चाहिए। –

+0

क्या यह होमवर्क है? –

+0

एक बेटा छिपाने वाले चर पर पिता – jsj

उत्तर

8

जावा में, फ़ील्ड पॉलिमॉर्फिक नहीं हैं।

Father father = new Son(); 
System.out.println(father.i); //why 1? Ans : reference is of type father, so 1 (fields are not polymorphic) 
System.out.println(father.getI()); //2 : overridden method called 
System.out.println(father.j); //why 10? Ans : reference is of type father, so 2 
System.out.println(father.getJ()); //why 10? there is not overridden getJ() method in Son class, so father.getJ() is called 

System.out.println(); 

// same explaination as above for following 
Son son = new Son(); 
System.out.println(son.i); //2 
System.out.println(son.getI()); //2 
System.out.println(son.j); //20 
System.out.println(son.getJ()); //why 10? 
+0

बस जावा में? कोई अन्य भाषा फ़ील्ड पर बहुरूपता प्रदान करती है? – UnKnown

2

प्रति Overriding and Hiding Methods

छिपा विधि लागू हो जाता है कि के संस्करण के रूप में यह सुपर क्लास या उपवर्ग से शुरू हो जाती है, इस पर निर्भर करता है।

यानी आप एक तरीका है जिसके एक सुपर वर्ग संदर्भ सुपर वर्ग विधि शुरू हो जाती है के माध्यम से उपवर्ग में ओवरराइड की गई है नारा है और यह सुपर वर्ग के सदस्यों तक पहुंचने देना।

System.out.println(son.getJ()); //why 10? 

getJ() के बाद से जो सदस्य देखता Son में निर्धारित नहीं है एक Father संस्करण शुरू हो जाती है:

System.out.println(father.i); //why 1? 
System.out.println(father.j); //why 10? 
System.out.println(father.getJ()); //why 10? 
इसी तरह निम्न के लिए

:

इसका उपयोग तब संदर्भ के रूप में निम्नलिखित बताते सुपर क्लास की है Father कक्षा में परिभाषित किया गया।

यदि आप Hiding Fields पढ़ते हैं; वे विशेष रूप से

आम तौर पर बोलते हुए, हम छिपाने वाले फ़ील्ड की अनुशंसा नहीं करते क्योंकि कोड को पढ़ने में मुश्किल होती है।