2010-03-17 20 views

उत्तर

23

क्योंकि विरासत व्यवहार को संशोधित करने का इरादा है। व्यवहार विधियों के माध्यम से उजागर किया जाता है, और यही कारण है कि वे ओवरराइड किया जा सकता है।

फ़ील्ड व्यवहार नहीं बल्कि राज्य हैं। आपको उसको संशोधित करने की आवश्यकता नहीं है, न ही सुपरक्लास द्वारा नियोजित निजी तरीकों। वे सुपरक्लास को अपना काम करने की इजाजत देने का इरादा रखते हैं।

28

आप एक फ़ील्ड छुपा सकते हैं, लेकिन ओवरराइड नहीं कर सकते हैं।

छिपाने का अर्थ है कि उस क्षेत्र के आधार पर एक फ़ील्ड का अलग-अलग मूल्य होगा। उप-वर्ग में फ़ील्ड सुपर-क्लास में फ़ील्ड को "छुपा" देगा, लेकिन दोनों मौजूद हैं।

एक बेहद खराब व्यवहार का क्षेत्र को छिपाने के लिए है, लेकिन काम करता है यही कारण है कि:

public class HideField { 

    public static class A 
    { 
     String name = "a"; 

     public void doIt1() { System.out.println(name); }; 
     public void doIt2() { System.out.println(name); }; 
    } 

    public static class B extends A 
    { 
     String name = "b"; 

     public void doIt2() { System.out.println(name); }; 
    } 

    public static void main(String[] args) 
    { 
     A a = new A(); 
     B b = new B(); 

     a.doIt1(); // print a 
     b.doIt1(); // print a 
     a.doIt2(); // print a 
     b.doIt2(); // print b <-- B.name hides A.name 
    } 
} 

विधि ओवरराइड गया था कि क्या, क्षेत्र A या B में पर निर्भर करता है पहुँचा जा सकता है।

ऐसा कभी नहीं करें! यह आपकी समस्या का समाधान कभी नहीं करता है और विरासत से संबंधित बहुत सूक्ष्म बग बनाता है।

+0

ओह यह करने के लिए अनिवार्य सलाह के लिए कई अपवर्तकों के लिए ओह। यह एक बुराई ओवरलैर्ड की तरह एक सांप में बदल रहा है .... यह कभी मदद नहीं करता है। –

+0

ऐसे सूक्ष्म कारण हैं जिन्हें आप पसंद कर सकते हैं: विशेष रूप से स्थैतिक वर्ग फ़ील्ड के साथ जिन्हें आप सुपर या सबक्लास नाम का उपयोग करके एक्सेस करते हैं। "कभी नहीं" कहने की कोई अच्छी बात नहीं है;) – RichieHH

+0

स्थिर का उपयोग करना पूरी तरह से एक और बात है, ओरेकल के पास @ewernli के साथ एक ही सुझाव है: http://docs.oracle.com/javase/tutorial/java/IandI/hidevariables.html – MengT

1

क्योंकि:

  • यह parent class कोड टूट सकता है। उदाहरण के लिए कोड को अपनाने पर विचार (क्या निम्नलिखित कोड में लाइन obB.getInt(); के व्यवहार होगा उदाहरण अधिभावी चर की अनुमति है,):

    class A 
    { 
        int aInt; 
    
        public int getInt() 
        { 
         return aInt; 
        } 
    } 
    
    class B extends A 
    { 
        int aInt; 
    
        public int getInt2() 
        { 
         return aInt; 
        } 
    
        public static void main(String[] args) 
        { 
         B obB = new B(); 
    
         //What would be behavior in following line if, 
         //instance variables overriding is allowed 
         obB.getInt(); 
        } 
    } 
    
  • यह तार्किक क्योंकि child class होना चाहिए/सभी व्यवहार को प्रतिबिंबित नहीं हैparent class

तो, आप केवल विरासत में मिला तरीकों/child class में चर छिपाते हैं, लेकिन override नहीं कर सकते हैं कर सकते हैं।

बाद Java doc from Oracle से एक उद्धरण को निर्दिष्ट क्या आपरेशन आप प्रदर्शन/child class से उम्मीद कर सकते हैं:

आप विरासत में मिला सदस्यों का उपयोग कर सकते है के रूप में, उन्हें बदलना, उन्हें छिपाने के लिए, या उन्हें नए सदस्यों के साथ पूरक :

  • विरासत वाले फ़ील्ड सीधे किसी भी अन्य फ़ील्ड की तरह उपयोग किए जा सकते हैं।
  • आप उपclass में एक क्षेत्र को सुपरक्लास में एक जैसा नाम घोषित कर सकते हैं, इस प्रकार इसे छुपाएं (अनुशंसित नहीं)।
संबंधित मुद्दे