2011-02-13 14 views
9

नीचे कोड "मुख्य" क्यों प्रिंट करता है?स्टेटिक तरीके में विरासत

public class Main 
{ 
    public static void method() 
    { 
     System.out.println("Main"); 
    } 

    public static void main(String[] args) 
    { 
     Main m = new SubMain(); 
     m.method(); 
    } 
} 

class SubMain extends Main 
{ 
    public static void method() 
    { 
     System.out.println("SubMain"); 
    } 
} 

रनटाइम पर, mSubmain का एक उदाहरण की ओर इशारा करते है, इसलिए यह धारणात्मक "SubMain" प्रिंट चाहिए।

+3

तुम भी 'लिख सकते हैं मुख्य मीटर = अशक्त बताता है;' और फिर विधि कॉल, बिंदु से पहले अभिव्यक्ति सब पर नहीं किया जाता है। –

उत्तर

18

स्टेटिक तरीकों चर का संकलन समय प्रकार पर हल कर रहे हैं। mMain प्रकार है, इसलिए Main में विधि को कॉल किया गया है।

यदि आप इसे SubMain m ... पर बदलते हैं, तो SubMain पर विधि को कॉल किया जाएगा।

+13

इस उत्तर के अतिरिक्त, मैं अनुशंसा करता हूं कि आप किसी आवृत्ति ऑब्जेक्ट से स्थैतिक विधियों को कॉल न करें और उन्हें m.method() के बजाय कक्षा के नाम (उदा: SubMain.method() से कॉल करें। – andrewjs

+0

यही कारण है कि जब आप किसी इंस्टेंस ऑब्जेक्ट पर स्थैतिक विधि का आह्वान करने का प्रयास करते हैं तो जावा आपको चेतावनी देता है। –

+0

@EricFitting Java आपको चेतावनी नहीं देता है लेकिन आपका विचार आपको चेतावनी दे सकता है। –

2

ग्रहण जब मैं बात की इस तरह से करने की कोशिश मुझे चेतावनी की इस तरह देता है:

स्थिर विधि XXX() प्रकार XXX से एक स्थिर तरीका

एक्सेस किया जाना है स्टेटिक विधियां विरासत में भाग नहीं लेती हैं। चर Main प्रकार है, इसलिए संकलक ने आपके फ़ंक्शन कॉल को Main.method() पर हल किया।

अतिरिक्त मज़े के लिए, m से null पर सेट करने का प्रयास करें।

15

यह इसलिए क्योंकि स्थिर तरीकों बहुरूपी नहीं हैं। इसके अलावा स्थैतिक विधि वस्तु द्वारा नहीं बल्कि कक्षा का उपयोग करके, Main.method() या SubMain.method() का उपयोग किया जाना चाहिए। जब आप m.method() पर कॉल कर रहे हैं तो जावा वास्तव में Main.method() पर कॉल करता है क्योंकि एम मुख्य प्रकार का है।

आप स्थिर तरीकों का उपयोग नहीं करते बहुरूपता का आनंद लेना चाहते हैं।

1

जावा स्थिर तरीकों के लिए जल्दी बाध्यकारी करता है, उदाहरण के तरीकों जो गतिशील रूप से बाध्य कर रहे हैं के विपरीत है।

क्योंकि आपका ऑब्जेक्ट वैरिएबल प्रकार का है मुख्य कॉल संकलन समय पर सुपरक्लास कार्यान्वयन के लिए बाध्य है।

एक अच्छा स्पष्टीकरण here उपलब्ध है।

0

स्थैतिक विधियों को उनके वर्ग के नाम से स्थिर रूप से बाध्य किया जाता है क्योंकि एम मुख्य श्रेणी का प्रकार है तो संकलन के बाद यह Main.method() के रूप में दिखेगा; अपने वर्ग के संकलन के बाद निम्न आदेश javap -c मुख्य बताता यू मुख्य वर्ग के लिए JVM विधानसभा कोड देख सकते हैं और यू निम्नलिखित m.method // आह्वान स्थिर स्थिर आह्वान देखना होगा, विशेष आह्वान है कि स्थिर चलाने बाध्यकारी आह्वान विशेष, आह्वान इंटरफ़ेस है कि गतिशील बंधन

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