2010-02-08 17 views
11
public class CallingStaticMethod { 
public static void method() { 
    System.out.println("I am in method"); 
} 
public static void main(String[] args) { 
    CallingStaticMethod csm = null; 
    csm.method(); 
    } 
} 

क्या कोई बता सकता है कि उपरोक्त कोड में स्थिर विधि कैसे लागू की जाती है?क्या होता है जब एक शून्य विधि संदर्भ का उपयोग कर एक स्थिर विधि का आह्वान किया जाता है?

+24

हर बार जब आप यह है कि एक तरह कोड लिखने बिल्ली का बच्चा मर जाता है –

+0

@ फ़ज़ी लॉलीपॉप: :-) @ ओपी: साल और साल पहले, मुझे इस व्यवहार से काटा गया था (और कड़ा हुआ था), सरल कारण यह उदाहरण के नोटेशन का उपयोग करके क्लास विधि को कॉल करने के लिए कभी नहीं हुआ था। (इसलिए मैंने सोचा कि मैं एक उदाहरण विधि बुला रहा था, और यही वह जगह है जहां परेशानी शुरू हुई।) इसे हर कीमत पर करने से बचें (ऐसा नहीं है कि मुझे लगता है कि आप कह रहे हैं कि आप चाहते हैं; मेरा लेना है कि आप इस बारे में उलझन में हैं कि यह क्यों नहीं करता है ' टी संकलन करने में विफल)। –

उत्तर

22

इसे संकलक द्वारा अनुकूलित किया गया है, क्योंकि क्लास का उदाहरण आवश्यक नहीं है। संकलक मूल रूप से

csm.method(); 

की जगह द्वारा

CallingStaticMethod.method(); 

यह सामान्य भी है एक अच्छा अभ्यास तो अपने आप को क्या करना है। यहां तक ​​कि औसत आईडीई चेतावनी देता है आप एक उदाहरण के माध्यम से स्थिर तरीकों तक पहुंचने के बारे में चेतावनी देते हैं, कम से कम ग्रहण यहां करता है।

+0

मुझे नहीं लगता कि यह है। आप इंस्टेंस सिंटैक्स का उपयोग करके स्थैतिक विधियों को कॉल कर सकते हैं, चाहे इसे ऑप्टिमाइज़ किया जा सके या नहीं। मैं इस विशेष फॉर्मूलेशन काम से थोड़ा आश्चर्यचकित हूं, लेकिन मुझे लगता है कि यह समझ में आता है। :-) –

+5

यह _always_ को संकलक द्वारा अनुकूलित किया जा सकता है, क्योंकि यह स्थैतिक है। – Bozho

+0

कंपाइलर इसे तेजी से चलाने के लिए कई तरीकों से कोड अनुकूलित कर सकते हैं। एक उदाहरण के बिना आपको ढेर आवंटित करने/पकड़ने की आवश्यकता नहीं है। – BalusC

3

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

instance.method();

रूप

Class.method() एक ही है;

+0

हाँ, CallingStaticMethod.method()। –

+0

यही वह है। इस पर मेरे सिर में एक बहुत दूर घंटी बज रही थी; मुझे लगता है कि इसे काटकर याद किया जाता है (मैं कभी भी कक्षा विधियों को कॉल करने के उदाहरणों का उपयोग नहीं करता हूं।) –

0

अच्छा यह बिल्कुल ठीक है। कक्षा ए के ऑब्जेक्ट इंस्टेंस द्वारा स्थिर विधि का उपयोग नहीं किया जा रहा है या तो आप इसे कक्षा के नाम या संदर्भ से कॉल करते हैं, संकलक इसे क्लास java.lang.Class के उदाहरण के माध्यम से कॉल करेगा।

FYI करें, प्रत्येक वर्ग (ऊपर चित्र में CallingStaticMethod) जावा में वर्ग 'java.lang.Class' का एक उदाहरण है। और जब भी आप कक्षा को परिभाषित करते हैं, तो उदाहरण java.lang.Class CallingStaticMethod = new java.lang.Class() के रूप में बनाया गया है;

तो विधि 'CallingStaticMethod' और इतने नल पॉइंटर एक्सेप्शन घटित नहीं होगा पर कहा जाता है।

उम्मीद है कि इससे मदद मिलती है।

0

हाँ हम कर सकते हैं। यह केवल अगर हम साथ अशक्त वस्तु गैर स्थिर विधि बुला रहे हैं NullPointerException फेंक देते हैं। अगर विधि स्थिर है यह & चलेंगे, तो विधि गैर स्थिर एक एनपीई के माध्यम से कहीं भी होगी है ...

To know more click here...

1

जावा भाषा विशिष्टता संदर्भ में प्राप्त होते हैं का मूल्यांकन किया है, तो खारिज कर दिया, और फिर स्थिर विधि कहते हैं आह्वान हो जाता है
15.12.4.1. Compute Target Reference (If Necessary)

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

भी विनिर्देश अपने उदाहरण की तरह में एक उदाहरण है।

जब लक्ष्य संदर्भ में की जाती है और फिर खारिज कर दिया क्योंकि मंगलाचरण मोड स्थिर है, संदर्भ को देखने के लिए कि क्या यह रिक्त है जांच नहीं कर रहा है:

class Test1 { 
    static void mountain() { 
     System.out.println("Monadnock"); 
    } 
    static Test1 favorite(){ 
     System.out.print("Mount "); 
     return null; 
    } 
    public static void main(String[] args) { 
     favorite().mountain(); 
    } 
} 
संबंधित मुद्दे