2012-08-15 11 views
20

जावा में निजी विधियों को ओवरराइड किया जा सकता है? यदि नहीं, तो निम्न कोड कैसे काम करता है?क्या उप-वर्ग में सुपर क्लास में निजी विधि ओवरराइड की जा सकती है?

class Base{ 
     private void func(){ 
      System.out.println("In Base Class func method !!");   
     }; 
} 

class Derived extends Base{ 
     public void func(){ // Is this a Method Overriding..????   
      System.out.println("In Derived Class func method"); 
     }  
} 

class InheritDemo{ 
     public static void main(String [] args){      
      Derived d = new Derived(); 
      d.func(); 
     } 
} 

उत्तर

2

नहीं, ऐसा नहीं है। आप इस तरह सुनिश्चित करने के लिए ओवरराइड को चिह्नित कर सकते हैं:

@Override 
public void func(){ 
    System.out.println("In Derived Class func method"); 
} 

और इस मामले में यह एक कंपाइलर त्रुटि होगी।

+1

अच्छा पुराना '@ ओवरराइड ', सुपर उपयोगी! – TheZ

+0

उत्तर देने के लिए धन्यवाद .. लेकिन कोड ठीक काम करता है भले ही मैंने सुपरक्लास फाइनल में विधि बनाई हो ... तो मुझे क्या लगता है कि अगर हम विभिन्न संशोधक के साथ उपclass में विधि के समान हस्ताक्षर का उपयोग करते हैं तो यह सिर्फ एक नई विधि बना रहा है उपरोक्त को ओवरराइड करने के बजाय उप-वर्ग का .. – AnkitChhajed

+0

संपादित देखें। मैंने 'निजी' को गलत तरीके से पढ़ाया। एक्सडी – Doorknob

17

नहीं, एक निजी विधि को ओवरराइड नहीं किया जा सकता है क्योंकि यह किसी अन्य वर्ग से दिखाई नहीं दे रहा है। आपने अपने उप-वर्ग के लिए एक नई विधि घोषित की है जिसका सुपरक्लास विधि से कोई संबंध नहीं है। इसे देखने का एक तरीका यह है कि खुद से पूछना है कि व्युत्पन्न कक्षा में super.func() लिखना कानूनी होगा या नहीं। जिस तरह से ओवरराइडिंग की जा रही विधि तक पहुंचने से ओवरराइडिंग विधि पर प्रतिबंध नहीं लगाया जा सकता है, लेकिन यह वही मामला होगा।

+1

हाँ .. और यदि यह ओवरराइड है तो अगर मैं सुपरक्लास का संदर्भ बनाता हूं और बेस क्लास ऑब्जेक्ट को असाइन करता हूं। टी भी काम करना चाहिए लेकिन यह – AnkitChhajed

1

आप ओवरराइड नहीं कर रहे हैं। आप निजी सदस्यों को ओवरराइड नहीं कर सकते हैं, आप केवल व्युत्पन्न में एक नई विधि को परिभाषित कर रहे हैं। व्युत्पन्न के पास निजी रूप से घोषित होने के बाद का बेस का कार्यान्वयन नहीं है। जब आप व्युत्पन्न में func() परिभाषित करते हैं तो आपको एक कंपाइलर त्रुटि नहीं मिलेगी, लेकिन ऐसा इसलिए है क्योंकि व्युत्पन्न नहीं जानता कि बेस का का कार्यान्वयन है। स्पष्ट होना: यह कहना गलत होगा कि आप func() के बेस के कार्यान्वयन को ओवरराइड कर रहे हैं।

+0

नहीं है ओह ओह, मैंने 'निजी' एक्सडी – Doorknob

1

नहीं क्योंकि आप Base b = new Derived(); जैसे कुछ करते हैं तो भी आप b.func() को कॉल करने में सक्षम नहीं होंगे। आप जो कर रहे हैं उसे "छुपा" कहा जाता है।

+0

हम्म को गलत तरीके से पढ़ा है .. बहुत धन्यवाद – AnkitChhajed

37

नहीं, आप इसे ओवरराइड नहीं कर रहे हैं। आप @Override के साथ इसे चिह्नित करने की कोशिश करके या super.func(); पर कॉल करने का प्रयास करके जांच सकते हैं। दोनों काम नहीं करेंगे; वे कंपाइलर त्रुटियों फेंक देते हैं।

इसके अलावा, इस बाहर की जाँच:

class Base { 
     private void func(){ 
      System.out.println("In base func method");   
     }; 
     public void func2() { 
      System.out.println("func2"); 
      func(); 
     } 
} 

class Derived extends Base { 
     public void func(){ // Is this an overriding method? 
      System.out.println("In Derived Class func method"); 
     } 
} 

class InheritDemo { 
     public static void main(String [] args) { 
      Derived D = new Derived(); 
      D.func2(); 
     } 
} 

यह प्रिंट होगा:

func2 
In base func method 

जब आप जनता के लिए Base में func() बदलने के लिए, तो यह एक ओवरराइड हो जाएगा, और उत्पादन होगा इसमें बदलें:

func2 
In Derived Class func method 
+1

@Polygnome: उदाहरण के लिए +1 यह दर्शाता है कि यह ओवरराइड नहीं है, और '@ ओवरराइड 'परीक्षण के लिए। इस मामले में गतिशील प्रेषण कैसे काम करता है (या काम नहीं करता है: डी) दिखाता है कि –

+2

+1। –

+1

बहुत अच्छा जवाब। –

0

चूंकि विधि निजी है, यह अन्य वर्गों के लिए दृश्यमान नहीं है। इसलिए व्युत्पन्न कक्षा इस विधि का उत्तराधिकारी नहीं है। तो यह

0

ओवरराइड करने के बजाय यहां छिपाने का तरीका होगा। स्थिर के मामले में क्या होता है।

0

असल में, आप नहीं overriding.Before Java5

एक ओवरराइड विधि की वापसी प्रकार माता पिता वर्ग के विधि के साथ मेल खाना चाहिए रहे हैं।

लेकिन जावा 5 ने कोविरिएंट रिटर्न प्रकार नामक एक नई सुविधा पेश की। आप एक ही हस्ताक्षर के साथ एक विधि को ओवरराइड कर सकते हैं लेकिन ऑब्जेक्ट का सबक्लास लौटाता है। दूसरे शब्दों में, उप-वर्ग में एक विधि किसी ऑब्जेक्ट को वापस कर सकती है जिसका प्रकार सुपरक्लास में उसी हस्ताक्षर के साथ विधि द्वारा लौटाए गए प्रकार का उप-वर्ग है। आप इस धागे का अनुसरण कर सकते हैं: Can overridden methods differ in return type?

-1

आप अदृश्य चीज़ को ओवरराइड नहीं कर सकते हैं या उप-वर्ग के लिए मौजूद नहीं है।

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