2010-03-26 16 views
5

जावा स्थिर तरीकों लेकिन का अधिभावी की अनुमति नहीं है,स्टेटिक तरीकों और उनके अधिभावी

class stat13 
{ 
    static void show() 
    { 
     System.out.println("Static in base"); 
    } 
    public static void main(String[] ar) 
    { 
     new next().show(); 
    } 
} 


class next extends stat13 
{ 
    static void show() 
    { 
     System.out.println("Static in derived"); 
    } 
} 

यहाँ नहीं किया अधिभावी है?

+0

कृपया प्रश्न संपादित करने पर विचार करें ... कोड इतना पठनीय नहीं है। – RubyDubee

+0

प्रश्न संपादित करने के लिए धन्यवाद pgras क्या आप मुझे बता सकते हैं कि आपने प्रारूपण कैसे किया? – abson

उत्तर

4

यह "छुपा" है, न कि "ओवरराइडिंग"। यह देखने के लिए, निम्न को main पद्धति को बदलने:

public static void main (String[] arghh) { 
    next n = new next(); 
    n.show(); 
    stat13 s = n; 
    s.show(); 
} 

यह मुद्रित करना चाहिए:

Static in derived 
Static in base 

अगर वहाँ असली अधिभावी चल रहा था, तो आप देखेंगे:

Static in derived 
Static in derived 

आमतौर पर इसे एक उदाहरण विधि का उपयोग करके स्थिर विधि का आह्वान करने के लिए बुरी शैली माना जाता है ... जैसा कि आप कर रहे हैं ... क्योंकि यह सोचना आसान है कि आप एक उदाहरण विधि का आह्वान कर रहे हैं, और भ्रमित हो यह सोचने के लिए कि ओवरराइड हो रहा है। जावा स्टाइल चेकर/कोड ऑडिट टूल आमतौर पर इसे स्टाइल त्रुटि/संभावित बग के रूप में फ़्लैग करेगा।

9

नहीं, आप कुछ भी ओवरराइड नहीं कर रहे हैं - आप छुपा रहे हैं मूल विधि।

यह दुर्भाग्यपूर्ण है कि जावा आपको संदर्भ के माध्यम से एक स्थिर विधि कॉल करने की अनुमति देता है। compile- पर किया जाता है

public static void showStat(stat13 x) 
{ 
    x.show(); 
} 
... 
showStat(new next()); 

दूसरे शब्दों में, सही विधि के लिए बाध्य:

next.show(); 

महत्वपूर्ण रूप से, इस कोड को अभी भी stat13 में मूल संस्करण कहेंगे: आपका कॉल इसे और अधिक बस के रूप में लिखा समय, और x के मूल्य से कोई लेना देना नहीं है - जो आमतौर पर ओवरराइडिंग के साथ होता है।

1

जावा इसके लिए कंपाइलर त्रुटि नहीं देता है। लेकिन यह विधि इस बात से व्यवहार नहीं करेगी कि आप इसकी क्या अपेक्षा करते हैं ... बेहतर समझाया गया here

0

ओवरराइडिंग तब होती है जब एक बच्चे-वर्ग एक विधि के लिए अपना स्वयं का कार्यान्वयन प्रदान करता है जैसे कि बाल-वर्ग का उदाहरण लागू किया जाएगा। यहां ऑपरेटिव शब्द है - उदाहरण।

कक्षा के संदर्भ में स्टेटिक विधियों का आह्वान किया जाता है उदा।

stat13.show(...); 

या

next.show(...); 

Fwiw, अपने नमूना कोड अधिभावी का एक उदाहरण नहीं है।

0

ऑब्जेक्ट स्तर पर ओवरराइडिंग होता है। पूर्व obj1.overridedmenthod() के लिए। और कक्षा स्तर विधि को ओवरराइड करने की कोई अवधारणा नहीं है ... यानी स्थिर विधि पूर्व: class.overridedmethod()।

और एक स्थैतिक विधि को ओवरराइड करने की इस अवधारणा को विधि छिपाने के रूप में नामित किया गया है।

एक साधारण उदाहरण आज़माएं।

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