2009-04-10 22 views
5

मेरे पास निम्न वर्ग हैं:क्या सुपर क्लास ओवरराइड विधि को कॉल नहीं करता है?

class foo { 
    public void a() { 
     print("a"); 
    } 
    public void b() { 
     a(); 
    } 
} 

class bar extends foo { 
    public void a() { 
     print("overwritten a"); 
    } 
} 

जब मैं अब bar.b() को कॉल करता हूं, तो मैं इसे foo में ओवरराइड विधि() को कॉल करना चाहता हूं। हालांकि, यह "ए" प्रिंट करता है।

+3

उपद्रव को क्षमा करें: इसे "ओवरराइडिंग" कहा जाता है, न कि "ओवरराइटिंग"। – erickson

+0

जैसा आपने लिखा है, उसे कोड करना चाहिए जैसा कि आप उम्मीद करते हैं - जैसा कि नीचे दिए गए कई उत्तर आपको प्राप्त करने के लिए सुझाव देते हैं, आपको अपने कोड में कुछ और करना होगा जो आप यहां नहीं दिखा रहे हैं। – Eborbob

उत्तर

7

जब मैं निम्नलिखित चलाएँ:

overwritten a 

जो है मैं देखने की उम्मीद करेंगे:

public class Program { 
    public static void main(String[] args) { 
     bar b = new bar(); 
     b.b(); 
    } 
} 

class foo { 
    public void a() { 
     System.out.printf("a"); 
    } 
    public void b() { 
     a(); 
    } 
} 

class bar extends foo { 
    public void a() { 
     System.out.printf("overwritten a"); 
    } 
} 

मैं निम्नलिखित उत्पादन मिलता है।

+0

आपने मुझे एक मिनट तक हराया। मुझे एक ही आउटपुट मिलता है। – Eddie

+0

पोस्टिंग में आपको हराया जा सकता है, अन्यथा, मेरा मानना ​​है कि इस प्रश्न को पोस्ट करने से पहले हमें यह आउटपुट तरीका मिला है। @Override सिफारिश –

1

क्या विधियां स्थैतिक के रूप में परिभाषित हैं? यही परिणाम है कि मैं परिणाम प्राप्त कर सकता था। मुझे इसके बारे में एक अच्छा स्पष्टीकरण मिला: http://faq.javaranch.com/view?OverridingVsHiding

9

ऐसा हो सकता है कि आप स्थैतिक विधियों का उपयोग करने की कोशिश कर रहे हैं, जो काम नहीं करेंगे क्योंकि वे ओवरराइड नहीं होते हैं।

जाँच के एक अच्छा तरीका bar.a (करने के लिए @Override एनोटेशन) जोड़ सकते हैं और यदि संकलक आप एक त्रुटि देता है देखने के लिए है कि एक() वास्तव में कुछ भी

+2

+1 यह मेरी समस्या थी; इसे संरक्षित करने के लिए सुपरटेप विधि को बदलना। मुझे जो नहीं मिलता है वह है कि सबटाइप विधि पर @ ओवरराइड टैग ने कंपाइलर को एक त्रुटि संदेश नहीं दिया, अगर यह काम नहीं करेगा। – Rob

0

आप अगर भ्रमित हो सकता है overidding नहीं है आप सी # या किसी अन्य भाषा से आ रहे हैं जहां आपको स्पष्ट रूप से वर्चुअल फ़ंक्शन और/या ओवरराइडिंग फ़ंक्शंस घोषित करना होगा।

जावा में, सभी इंस्टेंस फ़ंक्शंस वर्चुअल हैं, और इन्हें ओवरराइड किया जा सकता है - जब तक उन्हें निजी और/या अंतिम घोषित नहीं किया जाता है।

ऐसा करने के लिए नया @ ओवरराइड एनोटेशन निर्दिष्ट करना आवश्यक नहीं है, एनोटेशन जोड़ना केवल यह निर्दिष्ट करता है कि आपका इरादा ओवरराइड करना है, और यदि कोई ओवरराइड नहीं है तो कोई चेतावनी या त्रुटि उत्पन्न होगी। (यदि आपने गलती से उदाहरण के लिए विधि नाम गलत वर्तनी की है)।

एंड्रयू का उदाहरण दिखाता है कि यह कैसे काम करना चाहिए।

10

क्या आपके दो वर्ग अलग-अलग पैकेज में हैं? और क्या आपकी फू क्लास विधियों ने सार्वजनिक, संरक्षित, या निजी या पैकेज स्थानीय घोषित किया है? जाहिर है अगर वे निजी हैं, तो यह काम नहीं करेगा। शायद कम स्पष्ट, यह है कि यदि वे पैकेज स्थानीय हैं (यानी कोई सार्वजनिक/संरक्षित/निजी दायरा नहीं है) तो आप केवल मूल श्रेणी के समान पैकेज में हैं, तो आप उन्हें केवल ओवरराइड कर सकते हैं।

उदाहरण के लिए:

 
package original; 
public class Foo { 
    void a() { System.out.println("A"); } 
    public void b() { a(); } 
} 

package another; 
public class Bar extends original.Foo { 
    void a() { System.out.println("Overwritten A"); } 
} 

package another; 
public class Program { 
    public static void main(String[] args) { 
    Bar bar = new Bar(); 
    bar.b(); 
    } 
} 

इस मामले में, आप अभी भी 'ए' मिल जाएगा। यदि आप फू सार्वजनिक या संरक्षित में मूल() विधि घोषित करते हैं, तो आपको अपेक्षित परिणाम मिल जाएगा।

+2

के लिए – shieldgenerator7

0

घोड़े के मुंह से:

http://download.oracle.com/javase/tutorial/java/IandI/override.html

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

तो यदि वे दोनों स्थिर तरीके हैं और आप सुपर क्लास से विधि का आह्वान करते हैं, तो सुपर क्लास विधि को उपclass विधि नहीं कहा जाता है। तो वास्तव में, कोई ओवरराइड नहीं हो रहा है।

-1

जबकि मैं एक एंड्रॉइड प्रोग्राम पर काम कर रहा था, मुझे अपने जावा कक्षाओं में भी यही समस्या थी। यह पता चला कि समस्या कक्षाओं में नहीं थी, लेकिन जिस तरह से एंड्रॉइड फ्रेमवर्क स्क्रीन आउटपुट को संसाधित करता है।

उदाहरण के लिए यदि आउटपुट पेरेंट क्लास में ऑनक्रेट() विधि में प्रोग्राम किया गया था, तो एंड्रॉइड पहले बच्चे से परे बाल कक्षाओं से ओवरराइड विधियों के आउटपुट को सही ढंग से लाने में विफल रहा। ईमानदारी से मैं पूरी विधि कॉलिंग आदेश समझ में नहीं आता।

समस्या को हल करने के लिए मैंने बस ऑनस्यूम() में आउटपुट प्रोग्राम किया और अब यह ठीक काम करता प्रतीत होता है।

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